Translated German comments, removed redundant ones till cairo (incl.)
This commit is contained in:
parent
930e38e163
commit
8b11173f34
@ -71,53 +71,43 @@ namespace basegfx
|
||||
// involved in calculations
|
||||
bool isLastLineDefault() const;
|
||||
|
||||
// Auf Einheitsmatrix zuruecksetzen
|
||||
// reset to a standard matrix
|
||||
bool isIdentity() const;
|
||||
void identity();
|
||||
|
||||
// Invertierung
|
||||
bool isInvertible() const;
|
||||
bool invert();
|
||||
|
||||
// Normalisierung
|
||||
bool isNormalized() const;
|
||||
void normalize();
|
||||
|
||||
// Determinante
|
||||
double determinant() const;
|
||||
|
||||
// Trace
|
||||
double trace() const;
|
||||
|
||||
// Transpose
|
||||
void transpose();
|
||||
|
||||
// Rotation
|
||||
void rotate(double fRadiant);
|
||||
|
||||
// Translation
|
||||
void translate(double fX, double fY);
|
||||
|
||||
// Skalierung
|
||||
void scale(double fX, double fY);
|
||||
|
||||
// Shearing-Matrices
|
||||
void shearX(double fSx);
|
||||
void shearY(double fSy);
|
||||
|
||||
// Addition, Subtraktion
|
||||
|
||||
B2DHomMatrix& operator+=(const B2DHomMatrix& rMat);
|
||||
B2DHomMatrix& operator-=(const B2DHomMatrix& rMat);
|
||||
|
||||
// Vergleichsoperatoren
|
||||
bool operator==(const B2DHomMatrix& rMat) const;
|
||||
bool operator!=(const B2DHomMatrix& rMat) const;
|
||||
|
||||
// Multiplikation, Division mit Konstante
|
||||
B2DHomMatrix& operator*=(double fValue);
|
||||
B2DHomMatrix& operator/=(double fValue);
|
||||
|
||||
// Matritzenmultiplikation von links auf die lokale
|
||||
// matrix multiplication from the left to the local
|
||||
B2DHomMatrix& operator*=(const B2DHomMatrix& rMat);
|
||||
|
||||
// assignment operator
|
||||
@ -125,11 +115,10 @@ namespace basegfx
|
||||
|
||||
// Help routine to decompose given homogen 3x3 matrix to components. A correction of
|
||||
// the components is done to avoid inaccuracies.
|
||||
// Zerlegung
|
||||
bool decompose(B2DTuple& rScale, B2DTuple& rTranslate, double& rRotate, double& rShearX) const;
|
||||
};
|
||||
|
||||
// Addition, Subtraktion
|
||||
// addition, subtraction
|
||||
inline B2DHomMatrix operator+(const B2DHomMatrix& rMatA, const B2DHomMatrix& rMatB)
|
||||
{
|
||||
B2DHomMatrix aSum(rMatA);
|
||||
@ -144,7 +133,7 @@ namespace basegfx
|
||||
return aDiv;
|
||||
}
|
||||
|
||||
// Multiplikation, Division mit Konstante
|
||||
// multiplication, division by a constant
|
||||
inline B2DHomMatrix operator*(const B2DHomMatrix& rMat, double fValue)
|
||||
{
|
||||
B2DHomMatrix aNew(rMat);
|
||||
|
@ -55,7 +55,7 @@ class Process
|
||||
public:
|
||||
Process();
|
||||
~Process();
|
||||
// Methoden
|
||||
// methods
|
||||
void SetImage( const String &aAppPath, const String &aAppParams, const Environment *pEnv = NULL );
|
||||
sal_Bool Start();
|
||||
sal_uIntPtr GetExitCode();
|
||||
|
@ -40,7 +40,7 @@ class SbxBasicFormater;
|
||||
|
||||
SV_DECL_PTRARR_DEL(SbxFacs,SbxFactory*,5,5)
|
||||
|
||||
// AppData-Struktur for SBX:
|
||||
// AppData structure for SBX:
|
||||
struct SbxAppData
|
||||
{
|
||||
SbxError eSbxError; // Error code
|
||||
|
@ -53,10 +53,10 @@ struct TTLogMsg;
|
||||
typedef ::std::vector< AppWin* > EditList;
|
||||
|
||||
class BasicApp : public Application {
|
||||
short nWait; // Wait-Zaehler
|
||||
short nWait; // wait counter
|
||||
public:
|
||||
BasicFrame* pFrame; // Frame Window
|
||||
Accelerator* pMainAccel; // Acceleratoren
|
||||
BasicFrame* pFrame; // frame window
|
||||
Accelerator* pMainAccel; // accelerators
|
||||
|
||||
int Main( );
|
||||
|
||||
|
@ -219,7 +219,7 @@ long AppWin::PreNotify( NotifyEvent& rNEvt )
|
||||
if ( rNEvt.GetType() == EVENT_GETFOCUS )
|
||||
if ( pFrame->pList->back() != this )
|
||||
Activate();
|
||||
return sal_False; // Der event soll weiter verarbeitet werden
|
||||
return sal_False; // the event shall continue to be handled
|
||||
}
|
||||
|
||||
void AppWin::Activate()
|
||||
|
@ -1341,7 +1341,7 @@ StarBASIC* BasicManager::AddLib( SotStorage& rStorage, const String& rLibName, s
|
||||
BasicLibInfo* pLibInfo = CreateLibInfo();
|
||||
// Use original name otherwise ImpLoadLibary failes...
|
||||
pLibInfo->SetLibName( rLibName );
|
||||
// Funktioniert so aber nicht, wenn Name doppelt
|
||||
// but doesn't work this way if name exists twice
|
||||
sal_uInt16 nLibId = (sal_uInt16) pLibs->GetPos( pLibInfo );
|
||||
|
||||
// Set StorageName before load because it is compared with pCurStorage
|
||||
|
@ -1794,7 +1794,7 @@ SbxArrayRef StarBASIC::getUnoListeners( void )
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* Laden und Speichern
|
||||
* load and save
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
|
@ -32,10 +32,10 @@
|
||||
|
||||
#include "sbintern.hxx"
|
||||
#include "sbunoobj.hxx"
|
||||
#include "token.hxx" // Tokenizer
|
||||
#include "symtbl.hxx" // Symbolverwaltung
|
||||
#include "parser.hxx" // Parser
|
||||
#include "codegen.hxx" // Code-Generator
|
||||
#include "token.hxx"
|
||||
#include "symtbl.hxx"
|
||||
#include "parser.hxx"
|
||||
#include "codegen.hxx"
|
||||
#include <basic/basmgr.hxx>
|
||||
|
||||
SV_IMPL_PTRARR(SbErrorStack, SbErrorStackEntry*)
|
||||
|
@ -1244,8 +1244,8 @@ Any sbxToUnoValue( SbxVariable* pVar )
|
||||
return sbxToUnoValueImpl( pVar );
|
||||
}
|
||||
|
||||
// Funktion, um einen globalen Bezeichner im
|
||||
// UnoScope zu suchen und fuer Sbx zu wrappen
|
||||
// function to find a global identifier in
|
||||
// the UnoScope and to wrap it for Sbx
|
||||
static bool implGetTypeByName( const String& rName, Type& rRetType )
|
||||
{
|
||||
bool bSuccess = false;
|
||||
@ -4183,7 +4183,7 @@ sal_Bool SAL_CALL InvocationToAllListenerMapper::hasProperty(const ::rtl::OUStri
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// Uno-Service erzeugen
|
||||
// create Uno-Service
|
||||
// 1. Parameter == Prefix-Name of the macro
|
||||
// 2. Parameter == fully qualified name of the listener
|
||||
void SbRtl_CreateUnoListener( StarBASIC* pBasic, SbxArray& rPar, sal_Bool bWrite )
|
||||
|
@ -30,7 +30,7 @@
|
||||
#include "precompiled_basic.hxx"
|
||||
|
||||
#include "sbcomp.hxx"
|
||||
#include <basic/sbx.hxx> // w.g. ...IMPL_REF(...sbxvariable)
|
||||
#include <basic/sbx.hxx> // because of ...IMPL_REF(...sbxvariable)
|
||||
#include "expr.hxx"
|
||||
|
||||
/***************************************************************************
|
||||
@ -99,20 +99,20 @@ SbiExpression::~SbiExpression()
|
||||
delete pExpr;
|
||||
}
|
||||
|
||||
// Einlesen eines kompletten Bezeichners
|
||||
// Ein Bezeichner hat folgende Form:
|
||||
// reading in a complete identifier
|
||||
// an identifier has the following form:
|
||||
// name[(Parameter)][.Name[(parameter)]]...
|
||||
// Strukturelemente werden ueber das Element pNext verkoppelt,
|
||||
// damit sie nicht im Baum stehen.
|
||||
// structure elements are coupled via the element pNext,
|
||||
// so that they're not in the tree.
|
||||
|
||||
// Folgen Parameter ohne Klammer? Dies kann eine Zahl, ein String,
|
||||
// ein Symbol oder auch ein Komma sein (wenn der 1. Parameter fehlt)
|
||||
// Are there parameters without brackets following? This may be a number,
|
||||
// a string, a symbol or also a comma (if the 1st parameter is missing)
|
||||
|
||||
static sal_Bool DoParametersFollow( SbiParser* p, SbiExprType eCurExpr, SbiToken eTok )
|
||||
{
|
||||
if( eTok == LPAREN )
|
||||
return sal_True;
|
||||
// Aber nur, wenn CALL-aehnlich!
|
||||
// but only if similar to CALL!
|
||||
if( !p->WhiteSpace() || eCurExpr != SbSYMBOL )
|
||||
return sal_False;
|
||||
if ( eTok == NUMBER || eTok == MINUS || eTok == FIXSTRING
|
||||
@ -131,26 +131,26 @@ static sal_Bool DoParametersFollow( SbiParser* p, SbiExprType eCurExpr, SbiToken
|
||||
return sal_False;
|
||||
}
|
||||
|
||||
// Definition eines neuen Symbols
|
||||
// definition of a new symbol
|
||||
|
||||
static SbiSymDef* AddSym
|
||||
( SbiToken eTok, SbiSymPool& rPool, SbiExprType eCurExpr,
|
||||
const String& rName, SbxDataType eType, SbiParameters* pPar )
|
||||
{
|
||||
SbiSymDef* pDef;
|
||||
// A= ist keine Prozedur
|
||||
// A= is not a procedure
|
||||
sal_Bool bHasType = sal_Bool( eTok == EQ || eTok == DOT );
|
||||
if( ( !bHasType && eCurExpr == SbSYMBOL ) || pPar )
|
||||
{
|
||||
// Dies ist also eine Prozedur
|
||||
// da suche man doch den richtigen Pool raus, da Procs
|
||||
// immer in einem Public-Pool landen muessen
|
||||
// so this is a procedure
|
||||
// the correct pool should be found out, as
|
||||
// procs must always get into a public pool
|
||||
SbiSymPool* pPool = &rPool;
|
||||
if( pPool->GetScope() != SbPUBLIC )
|
||||
pPool = &rPool.GetParser()->aPublics;
|
||||
SbiProcDef* pProc = pPool->AddProc( rName );
|
||||
|
||||
// Sonderbehandlung fuer Colls wie Documents(1)
|
||||
// special treatment for Colls like Documents(1)
|
||||
if( eCurExpr == SbSTDEXPR )
|
||||
bHasType = sal_True;
|
||||
|
||||
@ -158,7 +158,7 @@ static SbiSymDef* AddSym
|
||||
pDef->SetType( bHasType ? eType : SbxEMPTY );
|
||||
if( pPar )
|
||||
{
|
||||
// Dummy-Parameter generieren
|
||||
// generate dummy parameters
|
||||
sal_uInt16 n = 1;
|
||||
for( short i = 0; i < pPar->GetSize(); i++ )
|
||||
{
|
||||
@ -170,22 +170,21 @@ static SbiSymDef* AddSym
|
||||
}
|
||||
else
|
||||
{
|
||||
// oder ein normales Symbol
|
||||
// or a normal symbol
|
||||
pDef = rPool.AddSym( rName );
|
||||
pDef->SetType( eType );
|
||||
}
|
||||
return pDef;
|
||||
}
|
||||
|
||||
// Zur Zeit sind sogar Keywords zugelassen (wg. gleichnamiger Dflt-Properties)
|
||||
// currently even keywords are allowed (because of Dflt properties of the same name)
|
||||
|
||||
SbiExprNode* SbiExpression::Term( const KeywordSymbolInfo* pKeywordSymbolInfo )
|
||||
{
|
||||
if( pParser->Peek() == DOT )
|
||||
{
|
||||
// eine WITH-Variable
|
||||
SbiExprNode* pWithVar = pParser->GetWithVar();
|
||||
// #26608: Ans Ende der Node-Kette gehen, um richtiges Objekt zu uebergeben
|
||||
// #26608: get to the node-chain's end to pass the correct object
|
||||
SbiSymDef* pDef = pWithVar ? pWithVar->GetRealVar() : NULL;
|
||||
SbiExprNode* pNd = NULL;
|
||||
if( !pDef )
|
||||
@ -207,23 +206,23 @@ SbiExprNode* SbiExpression::Term( const KeywordSymbolInfo* pKeywordSymbolInfo )
|
||||
}
|
||||
|
||||
SbiToken eTok = (pKeywordSymbolInfo == NULL) ? pParser->Next() : pKeywordSymbolInfo->m_eTok;
|
||||
// Anfang des Parsings merken
|
||||
// memorize the parsing's begin
|
||||
pParser->LockColumn();
|
||||
String aSym( (pKeywordSymbolInfo == NULL) ? pParser->GetSym() : pKeywordSymbolInfo->m_aKeywordSymbol );
|
||||
SbxDataType eType = (pKeywordSymbolInfo == NULL) ? pParser->GetType() : pKeywordSymbolInfo->m_eSbxDataType;
|
||||
SbiParameters* pPar = NULL;
|
||||
SbiExprListVector* pvMoreParLcl = NULL;
|
||||
// Folgen Parameter?
|
||||
// are there parameters following?
|
||||
SbiToken eNextTok = pParser->Peek();
|
||||
// Ist es ein benannter Parameter?
|
||||
// Dann einfach eine Stringkonstante erzeugen. Diese wird
|
||||
// im SbiParameters-ctor erkannt und weiterverarbeitet
|
||||
// is it a known parameter?
|
||||
// create a string constant then, which will be recognized
|
||||
// in the SbiParameters-ctor and is continued to be handled
|
||||
if( eNextTok == ASSIGN )
|
||||
{
|
||||
pParser->UnlockColumn();
|
||||
return new SbiExprNode( pParser, aSym );
|
||||
}
|
||||
// ab hier sind keine Keywords zugelassen!
|
||||
// no keywords allowed from here on!
|
||||
if( pParser->IsKwd( eTok ) )
|
||||
{
|
||||
if( pParser->IsCompatible() && eTok == INPUT )
|
||||
@ -257,9 +256,9 @@ SbiExprNode* SbiExpression::Term( const KeywordSymbolInfo* pKeywordSymbolInfo )
|
||||
eTok = pParser->Peek();
|
||||
}
|
||||
}
|
||||
// Es koennte ein Objektteil sein, wenn . oder ! folgt
|
||||
// Bei . muss aber die Variable bereits definiert sein; wenn pDef
|
||||
// nach der Suche NULL ist, isses ein Objekt!
|
||||
// It might be an object part, if . or ! is following.
|
||||
// In case of . the variable must already be defined;
|
||||
// it's an object, if pDef is NULL after the search.
|
||||
sal_Bool bObj = sal_Bool( ( eTok == DOT || eTok == EXCLAM )
|
||||
&& !pParser->WhiteSpace() );
|
||||
if( bObj )
|
||||
@ -269,18 +268,18 @@ SbiExprNode* SbiExpression::Term( const KeywordSymbolInfo* pKeywordSymbolInfo )
|
||||
eType = SbxOBJECT;
|
||||
else
|
||||
{
|
||||
// Name%. geht wirklich nicht!
|
||||
// Name%. really does not work!
|
||||
pParser->Error( SbERR_BAD_DECLARATION, aSym );
|
||||
bError = sal_True;
|
||||
}
|
||||
}
|
||||
// Suche:
|
||||
// Search:
|
||||
SbiSymDef* pDef = pParser->pPool->Find( aSym );
|
||||
if( !pDef )
|
||||
{
|
||||
// Teil der Runtime-Library?
|
||||
// AB 31.3.1996: In Parser-Methode ausgelagert
|
||||
// (wird auch in SbiParser::DefVar() in DIM.CXX benoetigt)
|
||||
// Part of the Runtime-Library?
|
||||
// from 31.3.1996: swapped out to parser-method
|
||||
// (is also needed in SbiParser::DefVar() in DIM.CXX)
|
||||
pDef = pParser->CheckRTLForSym( aSym, eType );
|
||||
|
||||
// #i109184: Check if symbol is or later will be defined inside module
|
||||
@ -291,8 +290,6 @@ SbiExprNode* SbiExpression::Term( const KeywordSymbolInfo* pKeywordSymbolInfo )
|
||||
}
|
||||
if( !pDef )
|
||||
{
|
||||
// Falls ein Punkt angegeben war, isses Teil eines Objekts,
|
||||
// also muss der Returnwert ein Objekt sein
|
||||
if( bObj )
|
||||
eType = SbxOBJECT;
|
||||
pDef = AddSym( eTok, *pParser->pPool, eCurExpr, aSym, eType, pPar );
|
||||
@ -305,8 +302,6 @@ SbiExprNode* SbiExpression::Term( const KeywordSymbolInfo* pKeywordSymbolInfo )
|
||||
else
|
||||
{
|
||||
|
||||
// Symbol ist bereits definiert.
|
||||
// Ist es eine Konstante?
|
||||
SbiConstDef* pConst = pDef->GetConstDef();
|
||||
if( pConst )
|
||||
{
|
||||
@ -315,9 +310,8 @@ SbiExprNode* SbiExpression::Term( const KeywordSymbolInfo* pKeywordSymbolInfo )
|
||||
else
|
||||
return new SbiExprNode( pParser, pConst->GetValue(), pConst->GetType() );
|
||||
}
|
||||
// Hat es Dimensionen,
|
||||
// und sind auch Parameter angegeben?
|
||||
// (Wobei 0 Parameter () entsprechen)
|
||||
|
||||
// 0 parameters come up to ()
|
||||
if( pDef->GetDims() )
|
||||
{
|
||||
if( pPar && pPar->GetSize() && pPar->GetSize() != pDef->GetDims() )
|
||||
@ -329,26 +323,26 @@ SbiExprNode* SbiExpression::Term( const KeywordSymbolInfo* pKeywordSymbolInfo )
|
||||
// #119187 Only error if types conflict
|
||||
if( eType >= SbxINTEGER && eType <= SbxSTRING && eType != eDefType )
|
||||
{
|
||||
// Wie? Erst mit AS definieren und dann einen Suffix nehmen?
|
||||
// How? Define with AS first and take a Suffix then?
|
||||
pParser->Error( SbERR_BAD_DECLARATION, aSym );
|
||||
bError = sal_True;
|
||||
}
|
||||
else if ( eType == SbxVARIANT )
|
||||
// Falls nix angegeben, den Typ des Eintrags nehmen
|
||||
// aber nur, wenn die Var nicht mit AS XXX definiert ist
|
||||
// damit erwischen wir n% = 5 : print n
|
||||
// if there's nothing named, take the type of the entry,
|
||||
// but only if the var hasn't been defined with AS XXX
|
||||
// so that we catch n% = 5 : print n
|
||||
eType = eDefType;
|
||||
}
|
||||
// Typcheck bei Variablen:
|
||||
// ist explizit im Scanner etwas anderes angegeben?
|
||||
// Bei Methoden ist dies OK!
|
||||
if( eType != SbxVARIANT && // Variant nimmt alles
|
||||
// checking type of variables:
|
||||
// is there named anything different in the scanner?
|
||||
// That's OK for methods!
|
||||
if( eType != SbxVARIANT && // Variant takes everything
|
||||
eType != pDef->GetType() &&
|
||||
!pDef->GetProcDef() )
|
||||
{
|
||||
// Es kann sein, dass pDef ein Objekt beschreibt, das bisher
|
||||
// nur als SbxVARIANT erkannt wurde, dann Typ von pDef aendern
|
||||
// AB, 16.12.95 (Vielleicht noch aehnliche Faelle moeglich ?!?)
|
||||
// maybe pDef describes an object that so far has only been
|
||||
// recognized as SbxVARIANT - then change type of pDef
|
||||
// from 16.12.95 (similar cases possible perhaps?!?)
|
||||
if( eType == SbxOBJECT && pDef->GetType() == SbxVARIANT )
|
||||
{
|
||||
pDef->SetType( SbxOBJECT );
|
||||
@ -367,11 +361,11 @@ SbiExprNode* SbiExpression::Term( const KeywordSymbolInfo* pKeywordSymbolInfo )
|
||||
pNd->aVar.pvMorePar = pvMoreParLcl;
|
||||
if( bObj )
|
||||
{
|
||||
// AB, 8.1.95: Objekt kann auch vom Typ SbxVARIANT sein
|
||||
// from 8.1.95: Object may also be of the type SbxVARIANT
|
||||
if( pDef->GetType() == SbxVARIANT )
|
||||
pDef->SetType( SbxOBJECT );
|
||||
// Falls wir etwas mit Punkt einscannen, muss der
|
||||
// Typ SbxOBJECT sein
|
||||
// if we scan something with point,
|
||||
// the type must be SbxOBJECT
|
||||
if( pDef->GetType() != SbxOBJECT && pDef->GetType() != SbxVARIANT )
|
||||
{
|
||||
// defer error until runtime if in vba mode
|
||||
@ -384,13 +378,13 @@ SbiExprNode* SbiExpression::Term( const KeywordSymbolInfo* pKeywordSymbolInfo )
|
||||
if( !bError )
|
||||
pNd->aVar.pNext = ObjTerm( *pDef );
|
||||
}
|
||||
// Merken der Spalte 1 wieder freigeben
|
||||
|
||||
pParser->UnlockColumn();
|
||||
return pNd;
|
||||
}
|
||||
|
||||
// Aufbau eines Objekt-Terms. Ein derartiger Term ist Teil
|
||||
// eines Ausdrucks, der mit einer Objektvariablen beginnt.
|
||||
// construction of an object term. A term of this kind is part
|
||||
// of an expression that begins with an object variable.
|
||||
|
||||
SbiExprNode* SbiExpression::ObjTerm( SbiSymDef& rObj )
|
||||
{
|
||||
@ -398,8 +392,8 @@ SbiExprNode* SbiExpression::ObjTerm( SbiSymDef& rObj )
|
||||
SbiToken eTok = pParser->Next();
|
||||
if( eTok != SYMBOL && !pParser->IsKwd( eTok ) && !pParser->IsExtra( eTok ) )
|
||||
{
|
||||
// #66745 Einige Operatoren koennen in diesem Kontext auch
|
||||
// als Identifier zugelassen werden, wichtig fuer StarOne
|
||||
// #66745 Some operators can also be allowed
|
||||
// as identifiers, important for StarOne
|
||||
if( eTok != MOD && eTok != NOT && eTok != AND && eTok != OR &&
|
||||
eTok != XOR && eTok != EQV && eTok != IMP && eTok != IS )
|
||||
{
|
||||
@ -416,7 +410,7 @@ SbiExprNode* SbiExpression::ObjTerm( SbiSymDef& rObj )
|
||||
SbiParameters* pPar = NULL;
|
||||
SbiExprListVector* pvMoreParLcl = NULL;
|
||||
eTok = pParser->Peek();
|
||||
// Parameter?
|
||||
|
||||
if( DoParametersFollow( pParser, eCurExpr, eTok ) )
|
||||
{
|
||||
bool bStandaloneExpression = false;
|
||||
@ -443,13 +437,13 @@ SbiExprNode* SbiExpression::ObjTerm( SbiSymDef& rObj )
|
||||
eType = SbxOBJECT;
|
||||
else
|
||||
{
|
||||
// Name%. geht wirklich nicht!
|
||||
// Name%. does really not work!
|
||||
pParser->Error( SbERR_BAD_DECLARATION, aSym );
|
||||
bError = sal_True;
|
||||
}
|
||||
}
|
||||
|
||||
// Der Symbol-Pool eines Objekts ist immer PUBLIC
|
||||
// an object's symbol pool is always PUBLIC
|
||||
SbiSymPool& rPool = rObj.GetPool();
|
||||
rPool.SetScope( SbPUBLIC );
|
||||
SbiSymDef* pDef = rPool.Find( aSym );
|
||||
@ -464,11 +458,6 @@ SbiExprNode* SbiExpression::ObjTerm( SbiSymDef& rObj )
|
||||
pNd->aVar.pvMorePar = pvMoreParLcl;
|
||||
if( bObj )
|
||||
{
|
||||
// Falls wir etwas mit Punkt einscannen, muss der
|
||||
// Typ SbxOBJECT sein
|
||||
|
||||
// Es kann sein, dass pDef ein Objekt beschreibt, das bisher
|
||||
// nur als SbxVARIANT erkannt wurde, dann Typ von pDef aendern
|
||||
if( pDef->GetType() == SbxVARIANT )
|
||||
pDef->SetType( SbxOBJECT );
|
||||
|
||||
@ -486,20 +475,20 @@ SbiExprNode* SbiExpression::ObjTerm( SbiSymDef& rObj )
|
||||
return pNd;
|
||||
}
|
||||
|
||||
// Als Operanden kommen in Betracht:
|
||||
// Konstante
|
||||
// skalare Variable
|
||||
// Strukturelemente
|
||||
// Array-Elemente
|
||||
// Funktionen
|
||||
// geklammerte Ausdruecke
|
||||
// an operand can be:
|
||||
// constant
|
||||
// scalar variable
|
||||
// structure elements
|
||||
// array elements
|
||||
// functions
|
||||
// bracketed expressions
|
||||
|
||||
SbiExprNode* SbiExpression::Operand( bool bUsedForTypeOf )
|
||||
{
|
||||
SbiExprNode *pRes;
|
||||
SbiToken eTok;
|
||||
|
||||
// Operand testen:
|
||||
// test operand:
|
||||
switch( eTok = pParser->Peek() )
|
||||
{
|
||||
case SYMBOL:
|
||||
@ -555,13 +544,13 @@ SbiExprNode* SbiExpression::Operand( bool bUsedForTypeOf )
|
||||
pRes->bComposite = sal_True;
|
||||
break;
|
||||
default:
|
||||
// Zur Zeit sind Keywords hier OK!
|
||||
// keywords here are OK at the moment!
|
||||
if( pParser->IsKwd( eTok ) )
|
||||
pRes = Term();
|
||||
else
|
||||
{
|
||||
pParser->Next();
|
||||
pRes = new SbiExprNode( pParser, 1.0, SbxDOUBLE ); // bei Fehlern
|
||||
pRes = new SbiExprNode( pParser, 1.0, SbxDOUBLE );
|
||||
pParser->Error( SbERR_UNEXPECTED, eTok );
|
||||
}
|
||||
}
|
||||
@ -848,7 +837,7 @@ SbiExprNode* SbiExpression::Like()
|
||||
SbiToken eTok = pParser->Next();
|
||||
pNd = new SbiExprNode( pParser, pNd, eTok, Comp() ), nCount++;
|
||||
}
|
||||
// Mehrere Operatoren hintereinander gehen nicht
|
||||
// multiple operands in a row does not work
|
||||
if( nCount > 1 && !pParser->IsVBASupportOn() )
|
||||
{
|
||||
pParser->Error( SbERR_SYNTAX );
|
||||
@ -882,9 +871,6 @@ SbiExprNode* SbiExpression::Boolean()
|
||||
|*
|
||||
***************************************************************************/
|
||||
|
||||
// Parsing einer Expression, die sich zu einer numerischen
|
||||
// Konstanten verarbeiten laesst.
|
||||
|
||||
SbiConstExpression::SbiConstExpression( SbiParser* p ) : SbiExpression( p )
|
||||
{
|
||||
if( pExpr->IsConstant() )
|
||||
@ -902,13 +888,12 @@ SbiConstExpression::SbiConstExpression( SbiParser* p ) : SbiExpression( p )
|
||||
}
|
||||
else
|
||||
{
|
||||
// #40204 Spezialbehandlung fuer sal_Bool-Konstanten
|
||||
// #40204 special treatment for sal_Bool-constants
|
||||
sal_Bool bIsBool = sal_False;
|
||||
if( pExpr->eNodeType == SbxVARVAL )
|
||||
{
|
||||
SbiSymDef* pVarDef = pExpr->GetVar();
|
||||
|
||||
// Ist es eine sal_Bool-Konstante?
|
||||
sal_Bool bBoolVal = sal_False;
|
||||
if( pVarDef->GetName().EqualsIgnoreCaseAscii( "true" ) )
|
||||
{
|
||||
@ -922,7 +907,6 @@ SbiConstExpression::SbiConstExpression( SbiParser* p ) : SbiExpression( p )
|
||||
bBoolVal = sal_False;
|
||||
}
|
||||
|
||||
// Wenn es ein sal_Bool ist, Node austauschen
|
||||
if( bIsBool )
|
||||
{
|
||||
delete pExpr;
|
||||
@ -988,7 +972,6 @@ SbiExprList::~SbiExprList()
|
||||
}
|
||||
}
|
||||
|
||||
// Parameter anfordern (ab 0)
|
||||
|
||||
SbiExpression* SbiExprList::Get( short n )
|
||||
{
|
||||
@ -1014,11 +997,11 @@ void SbiExprList::addExpression( SbiExpression* pExpr )
|
||||
|*
|
||||
***************************************************************************/
|
||||
|
||||
// Parsender Konstruktor:
|
||||
// Die Parameterliste wird komplett geparst.
|
||||
// "Prozedurname()" ist OK.
|
||||
// Dann handelt es sich um eine Funktion ohne Parameter
|
||||
// respektive um die Angabe eines Arrays als Prozedurparameter.
|
||||
// parsing constructor:
|
||||
// the parameter list is completely parsed
|
||||
// "procedurename()" is OK
|
||||
// it's a function without parameters then
|
||||
// i. e. you give an array as procedure parameter
|
||||
|
||||
// #i79918/#i80532: bConst has never been set to true
|
||||
// -> reused as bStandaloneExpression
|
||||
@ -1032,7 +1015,6 @@ SbiParameters::SbiParameters( SbiParser* p, sal_Bool bStandaloneExpression, sal_
|
||||
SbiExpression *pExpr;
|
||||
SbiToken eTok = pParser->Peek();
|
||||
|
||||
// evtl. Klammer auf weg:
|
||||
bool bAssumeExprLParenMode = false;
|
||||
bool bAssumeArrayMode = false;
|
||||
if( eTok == LPAREN )
|
||||
@ -1049,25 +1031,25 @@ SbiParameters::SbiParameters( SbiParser* p, sal_Bool bStandaloneExpression, sal_
|
||||
}
|
||||
}
|
||||
|
||||
// Ende-Test
|
||||
|
||||
if( ( bBracket && eTok == RPAREN ) || pParser->IsEoln( eTok ) )
|
||||
{
|
||||
if( eTok == RPAREN )
|
||||
pParser->Next();
|
||||
return;
|
||||
}
|
||||
// Parametertabelle einlesen und in richtiger Folge ablegen!
|
||||
// read in parameter table and lay down in correct order!
|
||||
SbiExpression* pLast = NULL;
|
||||
String aName;
|
||||
while( !bError )
|
||||
{
|
||||
aName.Erase();
|
||||
// Fehlendes Argument
|
||||
// missing argument
|
||||
if( eTok == COMMA )
|
||||
{
|
||||
pExpr = new SbiExpression( pParser, 0, SbxEMPTY );
|
||||
}
|
||||
// Benannte Argumente: entweder .name= oder name:=
|
||||
// named arguments: either .name= or name:=
|
||||
else
|
||||
{
|
||||
bool bByVal = false;
|
||||
@ -1117,7 +1099,7 @@ SbiParameters::SbiParameters( SbiParser* p, sal_Bool bStandaloneExpression, sal_
|
||||
if( pParser->Peek() == ASSIGN )
|
||||
{
|
||||
// VBA mode: name:=
|
||||
// SbiExpression::Term() hat einen String daraus gemacht
|
||||
// SbiExpression::Term() has made as string out of it
|
||||
aName = pExpr->GetString();
|
||||
delete pExpr;
|
||||
pParser->Next();
|
||||
@ -1137,7 +1119,7 @@ SbiParameters::SbiParameters( SbiParser* p, sal_Bool bStandaloneExpression, sal_
|
||||
if( bAssumeArrayMode )
|
||||
break;
|
||||
|
||||
// Naechstes Element?
|
||||
// next element?
|
||||
eTok = pParser->Peek();
|
||||
if( eTok != COMMA )
|
||||
{
|
||||
@ -1156,7 +1138,7 @@ SbiParameters::SbiParameters( SbiParser* p, sal_Bool bStandaloneExpression, sal_
|
||||
break;
|
||||
}
|
||||
}
|
||||
// Schliessende Klammer
|
||||
// closing bracket
|
||||
if( eTok == RPAREN )
|
||||
{
|
||||
pParser->Next();
|
||||
@ -1176,10 +1158,9 @@ SbiParameters::SbiParameters( SbiParser* p, sal_Bool bStandaloneExpression, sal_
|
||||
|*
|
||||
***************************************************************************/
|
||||
|
||||
// Parsender Konstruktor:
|
||||
// Eine Liste von Array-Dimensionen wird geparst. Die Ausdruecke werden
|
||||
// auf numerisch getestet. Das bCONST-Bit wird gesetzt, wenn alle Ausdruecke
|
||||
// Integer-Konstanten sind.
|
||||
// parsing constructor:
|
||||
// A list of array dimensions is parsed. The expressions are tested for being
|
||||
// numeric. The bCONST-Bit is reset when all expressions are Integer constants.
|
||||
|
||||
SbiDimList::SbiDimList( SbiParser* p ) : SbiExprList( p )
|
||||
{
|
||||
@ -1216,7 +1197,6 @@ SbiDimList::SbiDimList( SbiParser* p ) : SbiExprList( p )
|
||||
}
|
||||
else
|
||||
{
|
||||
// Nur eine Dim-Angabe
|
||||
pExpr1->SetBased();
|
||||
pExpr1->pNext = NULL;
|
||||
bConst &= pExpr1->IsIntConstant();
|
||||
|
@ -34,7 +34,7 @@
|
||||
#include "sbcomp.hxx"
|
||||
#include "iosys.hxx"
|
||||
|
||||
// Test, ob ein I/O-Channel angegeben wurde
|
||||
// test if there's an I/O channel
|
||||
|
||||
sal_Bool SbiParser::Channel( sal_Bool bAlways )
|
||||
{
|
||||
@ -54,15 +54,13 @@ sal_Bool SbiParser::Channel( sal_Bool bAlways )
|
||||
return bRes;
|
||||
}
|
||||
|
||||
// Fuer PRINT und WRITE wird bei Objektvariablen versucht,
|
||||
// die Default-Property anzusprechen.
|
||||
|
||||
// PRINT
|
||||
// it's tried that at object variables the Default-
|
||||
// Property is addressed for PRINT and WRITE
|
||||
|
||||
void SbiParser::Print()
|
||||
{
|
||||
sal_Bool bChan = Channel();
|
||||
// Die Ausdruecke zum Drucken:
|
||||
|
||||
while( !bAbort )
|
||||
{
|
||||
if( !IsEoln( Peek() ) )
|
||||
@ -93,7 +91,7 @@ void SbiParser::Print()
|
||||
void SbiParser::Write()
|
||||
{
|
||||
sal_Bool bChan = Channel();
|
||||
// Die Ausdruecke zum Drucken:
|
||||
|
||||
while( !bAbort )
|
||||
{
|
||||
SbiExpression* pExpr = new SbiExpression( this );
|
||||
@ -153,7 +151,7 @@ void SbiParser::LineInput()
|
||||
pExpr->Gen();
|
||||
aGen.Gen( _LINPUT );
|
||||
delete pExpr;
|
||||
aGen.Gen( _CHAN0 ); // ResetChannel() nicht mehr in StepLINPUT()
|
||||
aGen.Gen( _CHAN0 ); // ResetChannel() not in StepLINPUT() anymore
|
||||
}
|
||||
|
||||
// INPUT
|
||||
@ -178,7 +176,7 @@ void SbiParser::Input()
|
||||
else break;
|
||||
}
|
||||
delete pExpr;
|
||||
aGen.Gen( _CHAN0 ); // ResetChannel() nicht mehr in StepINPUT()
|
||||
aGen.Gen( _CHAN0 );
|
||||
}
|
||||
|
||||
// OPEN stringexpr FOR mode ACCCESS access mode AS Channel [Len=n]
|
||||
@ -209,8 +207,8 @@ void SbiParser::Open()
|
||||
{
|
||||
Next();
|
||||
eTok = Next();
|
||||
// Nur STREAM_READ,STREAM_WRITE-Flags in nMode beeinflussen
|
||||
nMode &= ~(STREAM_READ | STREAM_WRITE); // loeschen
|
||||
// influence only STREAM_READ,STREAM_WRITE-Flags in nMode
|
||||
nMode &= ~(STREAM_READ | STREAM_WRITE); // delete
|
||||
if( eTok == READ )
|
||||
{
|
||||
if( Peek() == WRITE )
|
||||
@ -254,7 +252,7 @@ void SbiParser::Open()
|
||||
default: break;
|
||||
}
|
||||
TestToken( AS );
|
||||
// Die Kanalnummer
|
||||
// channel number
|
||||
SbiExpression* pChan = new SbiExpression( this );
|
||||
if( !pChan )
|
||||
Error( SbERR_SYNTAX );
|
||||
@ -270,10 +268,10 @@ void SbiParser::Open()
|
||||
}
|
||||
}
|
||||
if( !pLen ) pLen = new SbiExpression( this, 128, SbxINTEGER );
|
||||
// Der Stack fuer den OPEN-Befehl sieht wie folgt aus:
|
||||
// Blocklaenge
|
||||
// Kanalnummer
|
||||
// Dateiname
|
||||
// the stack for the OPEN command looks as follows:
|
||||
// block length
|
||||
// channel number
|
||||
// file name
|
||||
pLen->Gen();
|
||||
if( pChan )
|
||||
pChan->Gen();
|
||||
|
@ -37,18 +37,18 @@ void SbiParser::If()
|
||||
{
|
||||
sal_uInt32 nEndLbl;
|
||||
SbiToken eTok = NIL;
|
||||
// Ende-Tokens ignorieren:
|
||||
// ignore end-tokens
|
||||
SbiExpression aCond( this );
|
||||
aCond.Gen();
|
||||
TestToken( THEN );
|
||||
if( IsEoln( Next() ) )
|
||||
{
|
||||
// Am Ende jeden Blocks muss ein Jump zu ENDIF
|
||||
// eingefuegt werden, damit bei ELSEIF nicht erneut die Bedingung
|
||||
// ausgewertet wird. Die Tabelle nimmt alle Absprungstellen auf.
|
||||
// At the end of each block a jump to ENDIF must be inserted,
|
||||
// so that the condition is not evaluated again at ELSEIF.
|
||||
// The table collects all jump points.
|
||||
#define JMP_TABLE_SIZE 100
|
||||
sal_uInt32 pnJmpToEndLbl[JMP_TABLE_SIZE]; // 100 ELSEIFs zulaessig
|
||||
sal_uInt16 iJmp = 0; // aktueller Tabellen-Index
|
||||
sal_uInt32 pnJmpToEndLbl[JMP_TABLE_SIZE]; // 100 ELSEIFs allowed
|
||||
sal_uInt16 iJmp = 0; // current table index
|
||||
|
||||
// multiline IF
|
||||
nEndLbl = aGen.Gen( _JUMPF, 0 );
|
||||
@ -64,7 +64,7 @@ void SbiParser::If()
|
||||
}
|
||||
while( eTok == ELSEIF )
|
||||
{
|
||||
// Bei erfolgreichem IF/ELSEIF auf ENDIF springen
|
||||
// jump to ENDIF in case of a successful IF/ELSEIF
|
||||
if( iJmp >= JMP_TABLE_SIZE )
|
||||
{
|
||||
Error( SbERR_PROG_TOO_LARGE ); bAbort = sal_True; return;
|
||||
@ -104,7 +104,7 @@ void SbiParser::If()
|
||||
else if( eTok == ENDIF )
|
||||
Next();
|
||||
|
||||
// Jmp-Tabelle abarbeiten
|
||||
|
||||
while( iJmp > 0 )
|
||||
{
|
||||
iJmp--;
|
||||
@ -143,7 +143,7 @@ void SbiParser::If()
|
||||
aGen.BackChain( nEndLbl );
|
||||
}
|
||||
|
||||
// ELSE/ELSEIF/ENDIF ohne IF
|
||||
// ELSE/ELSEIF/ENDIF without IF
|
||||
|
||||
void SbiParser::NoIf()
|
||||
{
|
||||
@ -213,7 +213,7 @@ void SbiParser::For()
|
||||
if( bForEach )
|
||||
Next();
|
||||
SbiExpression aLvalue( this, SbOPERAND );
|
||||
aLvalue.Gen(); // Variable auf dem Stack
|
||||
aLvalue.Gen(); // variable on the Stack
|
||||
|
||||
if( bForEach )
|
||||
{
|
||||
@ -227,10 +227,10 @@ void SbiParser::For()
|
||||
{
|
||||
TestToken( EQ );
|
||||
SbiExpression aStartExpr( this );
|
||||
aStartExpr.Gen(); // Startausdruck auf dem Stack
|
||||
aStartExpr.Gen();
|
||||
TestToken( TO );
|
||||
SbiExpression aStopExpr( this );
|
||||
aStopExpr.Gen(); // Endausdruck auf dem Stack
|
||||
aStopExpr.Gen();
|
||||
if( Peek() == STEP )
|
||||
{
|
||||
Next();
|
||||
@ -243,19 +243,19 @@ void SbiParser::For()
|
||||
aOne.Gen();
|
||||
}
|
||||
TestEoln();
|
||||
// Der Stack hat jetzt 4 Elemente: Variable, Start, Ende, Inkrement
|
||||
// Startwert binden
|
||||
// The stack has all 4 elements now: variable, start, end, increment
|
||||
// bind start value
|
||||
aGen.Gen( _INITFOR );
|
||||
}
|
||||
|
||||
sal_uInt32 nLoop = aGen.GetPC();
|
||||
// Test durchfuehren, evtl. Stack freigeben
|
||||
// do tests, maybe free the stack
|
||||
sal_uInt32 nEndTarget = aGen.Gen( _TESTFOR, 0 );
|
||||
OpenBlock( FOR );
|
||||
StmntBlock( NEXT );
|
||||
aGen.Gen( _NEXT );
|
||||
aGen.Gen( _JUMP, nLoop );
|
||||
// Kommen Variable nach NEXT?
|
||||
// are there variables after NEXT?
|
||||
if( Peek() == SYMBOL )
|
||||
{
|
||||
SbiExpression aVar( this, SbOPERAND );
|
||||
@ -272,16 +272,15 @@ void SbiParser::With()
|
||||
{
|
||||
SbiExpression aVar( this, SbOPERAND );
|
||||
|
||||
// Letzten Knoten in der Objekt-Kette ueberpruefen
|
||||
SbiExprNode *pNode = aVar.GetExprNode()->GetRealNode();
|
||||
SbiSymDef* pDef = pNode->GetVar();
|
||||
// Variant, AB 27.6.1997, #41090: bzw. empty -> muß Object sein
|
||||
// Variant, from 27.6.1997, #41090: empty -> must be Object
|
||||
if( pDef->GetType() == SbxVARIANT || pDef->GetType() == SbxEMPTY )
|
||||
pDef->SetType( SbxOBJECT );
|
||||
else if( pDef->GetType() != SbxOBJECT )
|
||||
Error( SbERR_NEEDS_OBJECT );
|
||||
|
||||
// Knoten auch auf SbxOBJECT setzen, damit spaeter Gen() klappt
|
||||
|
||||
pNode->SetType( SbxOBJECT );
|
||||
|
||||
OpenBlock( NIL, aVar.GetExprNode() );
|
||||
@ -289,7 +288,7 @@ void SbiParser::With()
|
||||
CloseBlock();
|
||||
}
|
||||
|
||||
// LOOP/NEXT/WEND ohne Konstrukt
|
||||
// LOOP/NEXT/WEND without construct
|
||||
|
||||
void SbiParser::BadBlock()
|
||||
{
|
||||
@ -312,11 +311,11 @@ void SbiParser::OnGoto()
|
||||
Error( SbERR_EXPECTED, "GoTo/GoSub" );
|
||||
eTok = GOTO;
|
||||
}
|
||||
// Label-Tabelle einlesen:
|
||||
|
||||
sal_uInt32 nLbl = 0;
|
||||
do
|
||||
{
|
||||
Next(); // Label holen
|
||||
Next(); // get label
|
||||
if( MayBeLabel() )
|
||||
{
|
||||
sal_uInt32 nOff = pProc->GetLabels().Reference( aSym );
|
||||
@ -371,7 +370,7 @@ void SbiParser::Select()
|
||||
sal_uInt32 nNextTarget = 0;
|
||||
sal_uInt32 nDoneTarget = 0;
|
||||
sal_Bool bElse = sal_False;
|
||||
// Die Cases einlesen:
|
||||
|
||||
while( !bAbort )
|
||||
{
|
||||
eTok = Next();
|
||||
@ -380,7 +379,7 @@ void SbiParser::Select()
|
||||
if( nNextTarget )
|
||||
aGen.BackChain( nNextTarget ), nNextTarget = 0;
|
||||
aGen.Statement();
|
||||
// Jeden Case einlesen
|
||||
|
||||
sal_Bool bDone = sal_False;
|
||||
sal_uInt32 nTrueTarget = 0;
|
||||
if( Peek() == ELSE )
|
||||
@ -429,13 +428,13 @@ void SbiParser::Select()
|
||||
if( Peek() == COMMA ) Next();
|
||||
else TestEoln(), bDone = sal_True;
|
||||
}
|
||||
// Alle Cases abgearbeitet
|
||||
|
||||
if( !bElse )
|
||||
{
|
||||
nNextTarget = aGen.Gen( _JUMP, nNextTarget );
|
||||
aGen.BackChain( nTrueTarget );
|
||||
}
|
||||
// den Statement-Rumpf bauen
|
||||
// build the statement body
|
||||
while( !bAbort )
|
||||
{
|
||||
eTok = Peek();
|
||||
@ -472,14 +471,14 @@ void SbiParser::On()
|
||||
SbiToken eTok = Peek();
|
||||
String aString = SbiTokenizer::Symbol(eTok);
|
||||
if (aString.EqualsIgnoreCaseAscii("ERROR"))
|
||||
eTok = _ERROR_; // Error kommt als SYMBOL
|
||||
eTok = _ERROR_; // Error comes as SYMBOL
|
||||
if( eTok != _ERROR_ && eTok != LOCAL ) OnGoto();
|
||||
else
|
||||
{
|
||||
if( eTok == LOCAL ) Next();
|
||||
Next (); // Kein TestToken mehr, da es sonst einen Fehler gibt
|
||||
Next (); // no more TestToken, as there'd be an error otherwise
|
||||
|
||||
Next(); // Token nach Error holen
|
||||
Next(); // get token after error
|
||||
if( eCurTok == GOTO )
|
||||
{
|
||||
// ON ERROR GOTO label|0
|
||||
|
@ -32,18 +32,18 @@
|
||||
#include "sbcomp.hxx"
|
||||
#include <com/sun/star/script/ModuleType.hpp>
|
||||
|
||||
struct SbiParseStack { // "Stack" fuer Statement-Blocks
|
||||
struct SbiParseStack { // "Stack" for statement-blocks
|
||||
SbiParseStack* pNext; // Chain
|
||||
SbiExprNode* pWithVar; // Variable fuer WITH
|
||||
SbiToken eExitTok; // Exit-Token
|
||||
SbiExprNode* pWithVar;
|
||||
SbiToken eExitTok;
|
||||
sal_uInt32 nChain; // JUMP-Chain
|
||||
};
|
||||
|
||||
struct SbiStatement {
|
||||
SbiToken eTok;
|
||||
void( SbiParser::*Func )(); // Verarbeitungsroutine
|
||||
sal_Bool bMain; // sal_True: ausserhalb SUBs OK
|
||||
sal_Bool bSubr; // sal_True: in SUBs OK
|
||||
void( SbiParser::*Func )();
|
||||
sal_Bool bMain; // sal_True: OK outside the SUB
|
||||
sal_Bool bSubr; // sal_True: OK inside the SUB
|
||||
};
|
||||
|
||||
#define Y sal_True
|
||||
@ -148,16 +148,16 @@ SbiParser::SbiParser( StarBASIC* pb, SbModule* pm )
|
||||
OSL_TRACE("Parser - %s, bClassModule %d", rtl::OUStringToOString( pm->GetName(), RTL_TEXTENCODING_UTF8 ).getStr(), bClassModule );
|
||||
pPool = &aPublics;
|
||||
for( short i = 0; i < 26; i++ )
|
||||
eDefTypes[ i ] = SbxVARIANT; // Kein expliziter Defaulttyp
|
||||
eDefTypes[ i ] = SbxVARIANT; // no explicit default type
|
||||
|
||||
aPublics.SetParent( &aGlobals );
|
||||
aGlobals.SetParent( &aRtlSyms );
|
||||
|
||||
// Die globale Chainkette faengt bei Adresse 0 an:
|
||||
|
||||
nGblChain = aGen.Gen( _JUMP, 0 );
|
||||
|
||||
rTypeArray = new SbxArray; // Array fuer Benutzerdefinierte Typen
|
||||
rEnumArray = new SbxArray; // Array for Enum types
|
||||
rTypeArray = new SbxArray; // array for user defined types
|
||||
rEnumArray = new SbxArray; // array for Enum types
|
||||
bVBASupportOn = pm->IsVBACompat();
|
||||
if ( bVBASupportOn )
|
||||
EnableCompatibility();
|
||||
@ -165,7 +165,7 @@ SbiParser::SbiParser( StarBASIC* pb, SbModule* pm )
|
||||
}
|
||||
|
||||
|
||||
// Ist Teil der Runtime-Library?
|
||||
// part of the runtime-library?
|
||||
SbiSymDef* SbiParser::CheckRTLForSym( const String& rSym, SbxDataType eType )
|
||||
{
|
||||
SbxVariable* pVar = GetBasic()->GetRtl()->Find( rSym, SbxCLASS_DONTCARE );
|
||||
@ -187,7 +187,7 @@ SbiSymDef* SbiParser::CheckRTLForSym( const String& rSym, SbxDataType eType )
|
||||
return pDef;
|
||||
}
|
||||
|
||||
// Globale Chainkette schliessen
|
||||
// close global chain
|
||||
|
||||
sal_Bool SbiParser::HasGlobalCode()
|
||||
{
|
||||
@ -210,7 +210,7 @@ void SbiParser::OpenBlock( SbiToken eTok, SbiExprNode* pVar )
|
||||
pStack = p;
|
||||
pWithVar = pVar;
|
||||
|
||||
// #29955 for-Schleifen-Ebene pflegen
|
||||
// #29955 service the for-loop level
|
||||
if( eTok == FOR )
|
||||
aGen.IncForLevel();
|
||||
}
|
||||
@ -221,7 +221,7 @@ void SbiParser::CloseBlock()
|
||||
{
|
||||
SbiParseStack* p = pStack;
|
||||
|
||||
// #29955 for-Schleifen-Ebene pflegen
|
||||
// #29955 service the for-loop level
|
||||
if( p->eExitTok == FOR )
|
||||
aGen.DecForLevel();
|
||||
|
||||
@ -264,7 +264,7 @@ sal_Bool SbiParser::TestSymbol( sal_Bool bKwdOk )
|
||||
return sal_False;
|
||||
}
|
||||
|
||||
// Testen auf ein bestimmtes Token
|
||||
|
||||
|
||||
sal_Bool SbiParser::TestToken( SbiToken t )
|
||||
{
|
||||
@ -279,7 +279,7 @@ sal_Bool SbiParser::TestToken( SbiToken t )
|
||||
}
|
||||
}
|
||||
|
||||
// Testen auf Komma oder EOLN
|
||||
|
||||
|
||||
sal_Bool SbiParser::TestComma()
|
||||
{
|
||||
@ -298,7 +298,7 @@ sal_Bool SbiParser::TestComma()
|
||||
return sal_True;
|
||||
}
|
||||
|
||||
// Testen, ob EOLN vorliegt
|
||||
|
||||
|
||||
void SbiParser::TestEoln()
|
||||
{
|
||||
@ -309,8 +309,7 @@ void SbiParser::TestEoln()
|
||||
}
|
||||
}
|
||||
|
||||
// Parsing eines Statement-Blocks
|
||||
// Das Parsing laeuft bis zum Ende-Token.
|
||||
|
||||
|
||||
void SbiParser::StmntBlock( SbiToken eEnd )
|
||||
{
|
||||
@ -325,8 +324,7 @@ void SbiParser::StmntBlock( SbiToken eEnd )
|
||||
}
|
||||
}
|
||||
|
||||
// Die Hauptroutine. Durch wiederholten Aufrufs dieser Routine wird
|
||||
// die Quelle geparst. Returnwert sal_False bei Ende/Fehlern.
|
||||
|
||||
|
||||
sal_Bool SbiParser::Parse()
|
||||
{
|
||||
@ -337,19 +335,19 @@ sal_Bool SbiParser::Parse()
|
||||
bErrorIsSymbol = false;
|
||||
Peek();
|
||||
bErrorIsSymbol = true;
|
||||
// Dateiende?
|
||||
|
||||
if( IsEof() )
|
||||
{
|
||||
// AB #33133: Falls keine Sub angelegt wurde, muss hier
|
||||
// der globale Chain abgeschlossen werden!
|
||||
// AB #40689: Durch die neue static-Behandlung kann noch
|
||||
// ein nGblChain vorhanden sein, daher vorher abfragen
|
||||
// AB #33133: If no sub has been created before,
|
||||
// the global chain must be closed here!
|
||||
// AB #40689: Due to the new static-handling there
|
||||
// can be another nGblChain, so ask for it before.
|
||||
if( bNewGblDefs && nGblChain == 0 )
|
||||
nGblChain = aGen.Gen( _JUMP, 0 );
|
||||
return sal_False;
|
||||
}
|
||||
|
||||
// Leerstatement?
|
||||
|
||||
if( IsEoln( eCurTok ) )
|
||||
{
|
||||
Next(); return sal_True;
|
||||
@ -357,20 +355,20 @@ sal_Bool SbiParser::Parse()
|
||||
|
||||
if( !bSingleLineIf && MayBeLabel( sal_True ) )
|
||||
{
|
||||
// Ist ein Label
|
||||
// is a label
|
||||
if( !pProc )
|
||||
Error( SbERR_NOT_IN_MAIN, aSym );
|
||||
else
|
||||
pProc->GetLabels().Define( aSym );
|
||||
Next(); Peek();
|
||||
// Leerstatement?
|
||||
|
||||
if( IsEoln( eCurTok ) )
|
||||
{
|
||||
Next(); return sal_True;
|
||||
}
|
||||
}
|
||||
|
||||
// Ende des Parsings?
|
||||
// end of parsing?
|
||||
if( eCurTok == eEndTok ||
|
||||
( bVBASupportOn && // #i109075
|
||||
(eCurTok == ENDFUNC || eCurTok == ENDPROPERTY || eCurTok == ENDSUB) &&
|
||||
@ -382,7 +380,7 @@ sal_Bool SbiParser::Parse()
|
||||
return sal_False;
|
||||
}
|
||||
|
||||
// Kommentar?
|
||||
// comment?
|
||||
if( eCurTok == REM )
|
||||
{
|
||||
Next(); return sal_True;
|
||||
@ -400,16 +398,16 @@ sal_Bool SbiParser::Parse()
|
||||
ePush = eCurTok;
|
||||
}
|
||||
}
|
||||
// Kommt ein Symbol, ist es entweder eine Variable( LET )
|
||||
// oder eine SUB-Prozedur( CALL ohne Klammern )
|
||||
// DOT fuer Zuweisungen im WITH-Block: .A=5
|
||||
// if there's a symbol, it's either a variable (LET)
|
||||
// or a SUB-procedure (CALL without brackets)
|
||||
// DOT for assignments in the WITH-block: .A=5
|
||||
if( eCurTok == SYMBOL || eCurTok == DOT )
|
||||
{
|
||||
if( !pProc )
|
||||
Error( SbERR_EXPECTED, SUB );
|
||||
else
|
||||
{
|
||||
// Damit Zeile & Spalte stimmen...
|
||||
// for correct line and column...
|
||||
Next();
|
||||
Push( eCurTok );
|
||||
aGen.Statement();
|
||||
@ -420,7 +418,7 @@ sal_Bool SbiParser::Parse()
|
||||
{
|
||||
Next();
|
||||
|
||||
// Hier folgen nun die Statement-Parser.
|
||||
// statement parsers
|
||||
|
||||
SbiStatement* p;
|
||||
for( p = StmntTable; p->eTok != NIL; p++ )
|
||||
@ -434,16 +432,15 @@ sal_Bool SbiParser::Parse()
|
||||
Error( SbERR_NOT_IN_SUBR, eCurTok );
|
||||
else
|
||||
{
|
||||
// globalen Chain pflegen
|
||||
// AB #41606/#40689: Durch die neue static-Behandlung kann noch
|
||||
// ein nGblChain vorhanden sein, daher vorher abfragen
|
||||
// AB #41606/#40689: Due to the new static-handling there
|
||||
// can be another nGblChain, so ask for it before.
|
||||
if( bNewGblDefs && nGblChain == 0 &&
|
||||
( eCurTok == SUB || eCurTok == FUNCTION || eCurTok == PROPERTY ) )
|
||||
{
|
||||
nGblChain = aGen.Gen( _JUMP, 0 );
|
||||
bNewGblDefs = sal_False;
|
||||
}
|
||||
// Statement-Opcode bitte auch am Anfang einer Sub
|
||||
// statement-opcode at the beginning of a sub, too, please
|
||||
if( ( p->bSubr && (eCurTok != STATIC || Peek() == SUB || Peek() == FUNCTION ) ) ||
|
||||
eCurTok == SUB || eCurTok == FUNCTION )
|
||||
aGen.Statement();
|
||||
@ -457,35 +454,34 @@ sal_Bool SbiParser::Parse()
|
||||
Error( SbERR_UNEXPECTED, eCurTok );
|
||||
}
|
||||
|
||||
// Test auf Ende des Statements:
|
||||
// Kann auch ein ELSE sein, da vor dem ELSE kein : stehen muss!
|
||||
// test for the statement's end -
|
||||
// might also be an ELSE, as there must not neccessary be a : before the ELSE!
|
||||
|
||||
if( !IsEos() )
|
||||
{
|
||||
Peek();
|
||||
if( !IsEos() && eCurTok != ELSE )
|
||||
{
|
||||
// falls das Parsing abgebrochen wurde, bis zum ":" vorgehen:
|
||||
// if the parsing has been aborted, jump over to the ":"
|
||||
Error( SbERR_UNEXPECTED, eCurTok );
|
||||
while( !IsEos() ) Next();
|
||||
}
|
||||
}
|
||||
// Der Parser bricht am Ende ab, das naechste Token ist noch nicht
|
||||
// geholt!
|
||||
// The parser aborts at the end, the
|
||||
// next token has not been fetched yet!
|
||||
return sal_True;
|
||||
}
|
||||
|
||||
// Innerste With-Variable liefern
|
||||
|
||||
SbiExprNode* SbiParser::GetWithVar()
|
||||
{
|
||||
if( pWithVar )
|
||||
return pWithVar;
|
||||
|
||||
// Sonst im Stack suchen
|
||||
SbiParseStack* p = pStack;
|
||||
while( p )
|
||||
{
|
||||
// LoopVar kann zur Zeit nur fuer with sein
|
||||
// LoopVar can at the moment only be for with
|
||||
if( p->pWithVar )
|
||||
return p->pWithVar;
|
||||
p = p->pNext;
|
||||
@ -494,7 +490,7 @@ SbiExprNode* SbiParser::GetWithVar()
|
||||
}
|
||||
|
||||
|
||||
// Zuweisung oder Subroutine Call
|
||||
// assignment or subroutine call
|
||||
|
||||
void SbiParser::Symbol( const KeywordSymbolInfo* pKeywordSymbolInfo )
|
||||
{
|
||||
@ -540,7 +536,7 @@ void SbiParser::Symbol( const KeywordSymbolInfo* pKeywordSymbolInfo )
|
||||
}
|
||||
else
|
||||
{
|
||||
// Dann muss es eine Zuweisung sein. Was anderes gibts nicht!
|
||||
// so it must be an assignment!
|
||||
if( !aVar.IsLvalue() )
|
||||
Error( SbERR_LVALUE_EXPECTED );
|
||||
TestToken( EQ );
|
||||
@ -566,7 +562,6 @@ void SbiParser::Symbol( const KeywordSymbolInfo* pKeywordSymbolInfo )
|
||||
}
|
||||
}
|
||||
|
||||
// Zuweisungen
|
||||
|
||||
void SbiParser::Assign()
|
||||
{
|
||||
@ -587,7 +582,7 @@ void SbiParser::Assign()
|
||||
aGen.Gen( _PUT );
|
||||
}
|
||||
|
||||
// Zuweisungen einer Objektvariablen
|
||||
// assignments of an object-variable
|
||||
|
||||
void SbiParser::Set()
|
||||
{
|
||||
@ -671,7 +666,7 @@ void SbiParser::RSet()
|
||||
aGen.Gen( _RSET );
|
||||
}
|
||||
|
||||
// DEFINT, DEFLNG, DEFSNG, DEFDBL, DEFSTR und so weiter
|
||||
// DEFINT, DEFLNG, DEFSNG, DEFDBL, DEFSTR and so on
|
||||
|
||||
void SbiParser::DefXXX()
|
||||
{
|
||||
@ -705,7 +700,7 @@ void SbiParser::DefXXX()
|
||||
void SbiParser::Stop()
|
||||
{
|
||||
aGen.Gen( _STOP );
|
||||
Peek(); // #35694: Nur Peek(), damit EOL in Single-Line-If erkannt wird
|
||||
Peek(); // #35694: only Peek(), so that EOL is recognized in Single-Line-If
|
||||
}
|
||||
|
||||
// IMPLEMENTS
|
||||
|
@ -903,8 +903,8 @@ void RTL_Impl_TraceCommand( StarBASIC* pBasic, SbxArray& rPar, sal_Bool bWrite )
|
||||
|
||||
#endif
|
||||
|
||||
// Diese Routine ist hier definiert, damit der Compiler als eigenes Segment
|
||||
// geladen werden kann.
|
||||
// This routine is defined here, so that the
|
||||
// compiler can be loaded as a discrete segment.
|
||||
|
||||
sal_Bool SbModule::Compile()
|
||||
{
|
||||
@ -914,7 +914,7 @@ sal_Bool SbModule::Compile()
|
||||
if( !pBasic )
|
||||
return sal_False;
|
||||
SbxBase::ResetError();
|
||||
// Aktuelles Modul!
|
||||
|
||||
SbModule* pOld = pCMOD;
|
||||
pCMOD = this;
|
||||
|
||||
@ -923,14 +923,14 @@ sal_Bool SbModule::Compile()
|
||||
if( !pParser->GetErrors() )
|
||||
pParser->aGen.Save();
|
||||
delete pParser;
|
||||
// fuer den Disassembler
|
||||
// for the disassembler
|
||||
if( pImage )
|
||||
pImage->aOUSource = aOUSource;
|
||||
|
||||
pCMOD = pOld;
|
||||
|
||||
// Beim Compilieren eines Moduls werden die Modul-globalen
|
||||
// Variablen aller Module ungueltig
|
||||
// compiling a module, the module-global
|
||||
// variables of all modules become invalid
|
||||
sal_Bool bRet = IsCompiled();
|
||||
if( bRet )
|
||||
{
|
||||
|
@ -97,12 +97,12 @@ void SbiScanner::GenError( SbError code )
|
||||
if( !bError && bErrors )
|
||||
{
|
||||
sal_Bool bRes = sal_True;
|
||||
// Nur einen Fehler pro Statement reporten
|
||||
// report only one error per statement
|
||||
bError = sal_True;
|
||||
if( pBasic )
|
||||
{
|
||||
// Falls EXPECTED oder UNEXPECTED kommen sollte, bezieht es sich
|
||||
// immer auf das letzte Token, also die Col1 uebernehmen
|
||||
// in case of EXPECTED or UNEXPECTED it always refers
|
||||
// to the last token, so take the Col1 over
|
||||
sal_uInt16 nc = nColLock ? nSavedCol1 : nCol1;
|
||||
switch( code )
|
||||
{
|
||||
@ -123,8 +123,8 @@ void SbiScanner::GenError( SbError code )
|
||||
nErrors++;
|
||||
}
|
||||
|
||||
// Falls sofort ein Doppelpunkt folgt, wird sal_True zurueckgeliefert.
|
||||
// Wird von SbiTokenizer::MayBeLabel() verwendet, um einen Label zu erkennen
|
||||
|
||||
// used by SbiTokenizer::MayBeLabel() to detect a label
|
||||
|
||||
sal_Bool SbiScanner::DoesColonFollow()
|
||||
{
|
||||
@ -135,7 +135,7 @@ sal_Bool SbiScanner::DoesColonFollow()
|
||||
else return sal_False;
|
||||
}
|
||||
|
||||
// Testen auf ein legales Suffix
|
||||
// test for legal suffix
|
||||
|
||||
static SbxDataType GetSuffixType( sal_Unicode c )
|
||||
{
|
||||
@ -149,8 +149,8 @@ static SbxDataType GetSuffixType( sal_Unicode c )
|
||||
return SbxVARIANT;
|
||||
}
|
||||
|
||||
// Einlesen des naechsten Symbols in die Variablen aSym, nVal und eType
|
||||
// Returnwert ist sal_False bei EOF oder Fehlern
|
||||
// reading the next symbol into the variables aSym, nVal and eType
|
||||
// return value is sal_False at EOF or errors
|
||||
#define BUF_SIZE 80
|
||||
|
||||
namespace {
|
||||
@ -165,7 +165,7 @@ inline bool lclIsWhitespace( sal_Unicode cChar )
|
||||
|
||||
sal_Bool SbiScanner::NextSym()
|
||||
{
|
||||
// Fuer den EOLN-Fall merken
|
||||
// memorize for the EOLN-case
|
||||
sal_uInt16 nOldLine = nLine;
|
||||
sal_uInt16 nOldCol1 = nCol1;
|
||||
sal_uInt16 nOldCol2 = nCol2;
|
||||
@ -177,7 +177,7 @@ sal_Bool SbiScanner::NextSym()
|
||||
bSymbol =
|
||||
bNumber = bSpaces = sal_False;
|
||||
|
||||
// Zeile einlesen?
|
||||
// read in line?
|
||||
if( !pLine )
|
||||
{
|
||||
sal_Int32 n = nBufPos;
|
||||
@ -207,13 +207,13 @@ sal_Bool SbiScanner::NextSym()
|
||||
nColLock = 0;
|
||||
}
|
||||
|
||||
// Leerstellen weg:
|
||||
|
||||
while( lclIsWhitespace( *pLine ) )
|
||||
pLine++, nCol++, bSpaces = sal_True;
|
||||
|
||||
nCol1 = nCol;
|
||||
|
||||
// nur Leerzeile?
|
||||
// only blank line?
|
||||
if( !*pLine )
|
||||
goto eoln;
|
||||
|
||||
@ -227,10 +227,10 @@ sal_Bool SbiScanner::NextSym()
|
||||
bHash = sal_True;
|
||||
}
|
||||
|
||||
// Symbol? Dann Zeichen kopieren.
|
||||
// copy character if symbol
|
||||
if( BasicSimpleCharClass::isAlpha( *pLine, bCompatible ) || *pLine == '_' )
|
||||
{
|
||||
// Wenn nach '_' nichts kommt, ist es ein Zeilenabschluss!
|
||||
// if there's nothing behind '_' , it's the end of a line!
|
||||
if( *pLine == '_' && !*(pLine+1) )
|
||||
{ pLine++;
|
||||
goto eoln; }
|
||||
@ -263,16 +263,16 @@ sal_Bool SbiScanner::NextSym()
|
||||
}
|
||||
}
|
||||
|
||||
// Abschliessendes '_' durch Space ersetzen, wenn Zeilenende folgt
|
||||
// (sonst falsche Zeilenfortsetzung)
|
||||
// replace closing '_' by space when end of line is following
|
||||
// (wrong line continuation otherwise)
|
||||
if( !bUsedForHilite && !*pLine && *(pLine-1) == '_' )
|
||||
{
|
||||
aSym.GetBufferAccess(); // #109693 force copy if necessary
|
||||
*((sal_Unicode*)(pLine-1)) = ' '; // cast wegen const
|
||||
*((sal_Unicode*)(pLine-1)) = ' '; // cast because of const
|
||||
}
|
||||
// Typkennung?
|
||||
// Das Ausrufezeichen bitte nicht testen, wenn
|
||||
// danach noch ein Symbol anschliesst
|
||||
// type recognition?
|
||||
// don't test the exclamation mark
|
||||
// if there's a symbol behind it
|
||||
else if( *pLine != '!' || !BasicSimpleCharClass::isAlpha( pLine[ 1 ], bCompatible ) )
|
||||
{
|
||||
SbxDataType t = GetSuffixType( *pLine );
|
||||
@ -285,7 +285,7 @@ sal_Bool SbiScanner::NextSym()
|
||||
}
|
||||
}
|
||||
|
||||
// Zahl? Dann einlesen und konvertieren.
|
||||
// read in and convert if number
|
||||
else if( BasicSimpleCharClass::isDigit( *pLine & 0xFF )
|
||||
|| ( *pLine == '.' && BasicSimpleCharClass::isDigit( *(pLine+1) & 0xFF ) ) )
|
||||
{
|
||||
@ -297,14 +297,14 @@ sal_Bool SbiScanner::NextSym()
|
||||
sal_Bool bBufOverflow = sal_False;
|
||||
while( strchr( "0123456789.DEde", *pLine ) && *pLine )
|
||||
{
|
||||
// AB 4.1.1996: Buffer voll? -> leer weiter scannen
|
||||
// from 4.1.1996: buffer full? -> go on scanning empty
|
||||
if( (p-buf) == (BUF_SIZE-1) )
|
||||
{
|
||||
bBufOverflow = sal_True;
|
||||
pLine++, nCol++;
|
||||
continue;
|
||||
}
|
||||
// Komma oder Exponent?
|
||||
// point or exponent?
|
||||
if( *pLine == '.' )
|
||||
{
|
||||
if( ++comma > 1 )
|
||||
@ -320,7 +320,7 @@ sal_Bool SbiScanner::NextSym()
|
||||
pLine++; nCol++; continue;
|
||||
}
|
||||
*p++ = 'E'; pLine++; nCol++;
|
||||
// Vorzeichen hinter Exponent?
|
||||
|
||||
if( *pLine == '+' )
|
||||
pLine++, nCol++;
|
||||
else
|
||||
@ -336,12 +336,12 @@ sal_Bool SbiScanner::NextSym()
|
||||
}
|
||||
*p = 0;
|
||||
aSym = p; bNumber = sal_True;
|
||||
// Komma, Exponent mehrfach vorhanden?
|
||||
|
||||
if( comma > 1 || exp > 1 )
|
||||
{ aError = '.';
|
||||
GenError( SbERR_BAD_CHAR_IN_NUMBER ); }
|
||||
|
||||
// #57844 Lokalisierte Funktion benutzen
|
||||
// #57844 use localized function
|
||||
nVal = rtl_math_uStringToDouble( buf, buf+(p-buf), '.', ',', NULL, NULL );
|
||||
|
||||
ndig = ndig - comma;
|
||||
@ -356,7 +356,7 @@ sal_Bool SbiScanner::NextSym()
|
||||
if( bBufOverflow )
|
||||
GenError( SbERR_MATH_OVERFLOW );
|
||||
|
||||
// Typkennung?
|
||||
// type recognition?
|
||||
SbxDataType t = GetSuffixType( *pLine );
|
||||
if( t != SbxVARIANT )
|
||||
{
|
||||
@ -366,7 +366,7 @@ sal_Bool SbiScanner::NextSym()
|
||||
}
|
||||
}
|
||||
|
||||
// Hex/Oktalzahl? Einlesen und konvertieren:
|
||||
// Hex/octal number? Read in and convert:
|
||||
else if( *pLine == '&' )
|
||||
{
|
||||
pLine++; nCol++;
|
||||
@ -383,7 +383,7 @@ sal_Bool SbiScanner::NextSym()
|
||||
case 'H':
|
||||
break;
|
||||
default :
|
||||
// Wird als Operator angesehen
|
||||
// treated as an operator
|
||||
pLine--; nCol--; nCol1 = nCol-1; aSym = '&'; return SYMBOL;
|
||||
}
|
||||
bNumber = sal_True;
|
||||
@ -395,7 +395,7 @@ sal_Bool SbiScanner::NextSym()
|
||||
sal_Unicode ch = sal::static_int_cast< sal_Unicode >(
|
||||
toupper( *pLine & 0xFF ) );
|
||||
pLine++; nCol++;
|
||||
// AB 4.1.1996: Buffer voll, leer weiter scannen
|
||||
// from 4.1.1996: buffer full, go on scanning empty
|
||||
if( (p-buf) == (BUF_SIZE-1) )
|
||||
bBufOverflow = sal_True;
|
||||
else if( String( cmp ).Search( ch ) != STRING_NOTFOUND )
|
||||
@ -447,7 +447,7 @@ sal_Bool SbiScanner::NextSym()
|
||||
aSym = aLine.copy( n - 1, nCol - n + 1);
|
||||
else
|
||||
aSym = aLine.copy( n, nCol - n - 1 );
|
||||
// Doppelte Stringbegrenzer raus
|
||||
// get out duplicate string delimiters
|
||||
String s( cSep );
|
||||
s += cSep;
|
||||
sal_uInt16 nIdx = 0;
|
||||
@ -463,12 +463,12 @@ sal_Bool SbiScanner::NextSym()
|
||||
if( cSep != ']' )
|
||||
eScanType = ( cSep == '#' ) ? SbxDATE : SbxSTRING;
|
||||
}
|
||||
// ungueltige Zeichen:
|
||||
// invalid characters:
|
||||
else if( ( *pLine & 0xFF ) >= 0x7F )
|
||||
{
|
||||
GenError( SbERR_SYNTAX ); pLine++; nCol++;
|
||||
}
|
||||
// andere Gruppen:
|
||||
// other groups:
|
||||
else
|
||||
{
|
||||
short n = 1;
|
||||
@ -485,7 +485,7 @@ sal_Bool SbiScanner::NextSym()
|
||||
nCol2 = nCol-1;
|
||||
|
||||
PrevLineCommentLbl:
|
||||
// Kommentar?
|
||||
|
||||
if( bPrevLineExtentsComment || (eScanType != SbxSTRING &&
|
||||
( aSym.GetBuffer()[0] == '\'' || aSym.EqualsIgnoreCaseAscii( "REM" ) ) ) )
|
||||
{
|
||||
@ -499,8 +499,7 @@ PrevLineCommentLbl:
|
||||
}
|
||||
return sal_True;
|
||||
|
||||
// Sonst Zeilen-Ende: aber bitte auf '_' testen, ob die
|
||||
// Zeile nicht weitergeht!
|
||||
|
||||
eoln:
|
||||
if( nCol && *--pLine == '_' )
|
||||
{
|
||||
|
@ -37,11 +37,11 @@
|
||||
SV_IMPL_PTRARR(SbiStrings,String*)
|
||||
SV_IMPL_PTRARR(SbiSymbols,SbiSymDef*)
|
||||
|
||||
// Alle Symbolnamen werden im Stringpool des Symbol-Pools abgelegt, damit
|
||||
// alle Symbole im gleichen Case verarbeitet werden. Beim Speichern des
|
||||
// Code-Images wird der globale Stringpool mit den entsprechenden Sympools
|
||||
// gespeichert. Der lokale Stringpool nimmt alle Symbole auf, die nicht
|
||||
// ins Image wandern (Labels, Konstantennamen etc).
|
||||
// All symbol names are laid down int the symbol-pool's stringpool, so that
|
||||
// all symbols are handled in the same case. On saving the code-image, the
|
||||
// global stringpool with the respective symbols is also saved.
|
||||
// The local stringpool holds all the symbols that don't move to the image
|
||||
// (labels, constant names etc.).
|
||||
|
||||
/***************************************************************************
|
||||
|*
|
||||
@ -57,7 +57,6 @@ SbiStringPool::SbiStringPool( SbiParser* p )
|
||||
SbiStringPool::~SbiStringPool()
|
||||
{}
|
||||
|
||||
// Suchen
|
||||
|
||||
const String& SbiStringPool::Find( sal_uInt16 n ) const
|
||||
{
|
||||
@ -67,8 +66,7 @@ const String& SbiStringPool::Find( sal_uInt16 n ) const
|
||||
return *aData.GetObject( n-1 );
|
||||
}
|
||||
|
||||
// Hinzufuegen eines Strings. Der String wird Case-Insensitiv
|
||||
// verglichen.
|
||||
|
||||
|
||||
short SbiStringPool::Add( const String& rVal, sal_Bool bNoCase )
|
||||
{
|
||||
@ -117,7 +115,6 @@ SbiSymPool::SbiSymPool( SbiStringPool& r, SbiSymScope s ) : rStrings( r )
|
||||
SbiSymPool::~SbiSymPool()
|
||||
{}
|
||||
|
||||
// Inhalt loeschen
|
||||
|
||||
void SbiSymPool::Clear()
|
||||
{
|
||||
@ -138,7 +135,6 @@ SbiSymDef* SbiSymPool::Next()
|
||||
return aData.GetObject( nCur );
|
||||
}
|
||||
|
||||
// Hinzufuegen eines Symbols
|
||||
|
||||
SbiSymDef* SbiSymPool::AddSym( const String& rName )
|
||||
{
|
||||
@ -157,7 +153,7 @@ SbiProcDef* SbiSymPool::AddProc( const String& rName )
|
||||
SbiProcDef* p = new SbiProcDef( pParser, rName );
|
||||
p->nPos = aData.Count();
|
||||
p->nId = rStrings.Add( rName );
|
||||
// Procs sind immer global
|
||||
// procs are always local
|
||||
p->nProcId = 0;
|
||||
p->pIn = this;
|
||||
const SbiSymDef* q = p;
|
||||
@ -165,7 +161,7 @@ SbiProcDef* SbiSymPool::AddProc( const String& rName )
|
||||
return p;
|
||||
}
|
||||
|
||||
// Hinzufuegen einer extern aufgebauten Symboldefinition
|
||||
// adding an externally constructed symbol definition
|
||||
|
||||
void SbiSymPool::Add( SbiSymDef* pDef )
|
||||
{
|
||||
@ -174,7 +170,7 @@ void SbiSymPool::Add( SbiSymDef* pDef )
|
||||
if( pDef->pIn )
|
||||
{
|
||||
#ifdef DBG_UTIL
|
||||
// schon in einem anderen Pool drin!
|
||||
|
||||
pParser->Error( SbERR_INTERNAL_ERROR, "Dbl Pool" );
|
||||
#endif
|
||||
return;
|
||||
@ -183,8 +179,8 @@ void SbiSymPool::Add( SbiSymDef* pDef )
|
||||
pDef->nPos = aData.Count();
|
||||
if( !pDef->nId )
|
||||
{
|
||||
// Bei statischen Variablen muss ein eindeutiger Name
|
||||
// im Stringpool erzeugt werden (Form ProcName:VarName)
|
||||
// A unique name must be created in the string pool
|
||||
// for static variables (Form ProcName:VarName)
|
||||
String aName( pDef->aName );
|
||||
if( pDef->IsStatic() )
|
||||
{
|
||||
@ -194,7 +190,7 @@ void SbiSymPool::Add( SbiSymDef* pDef )
|
||||
}
|
||||
pDef->nId = rStrings.Add( aName );
|
||||
}
|
||||
// Procs sind immer global
|
||||
|
||||
if( !pDef->GetProcDef() )
|
||||
pDef->nProcId = nProcId;
|
||||
pDef->pIn = this;
|
||||
@ -203,7 +199,6 @@ void SbiSymPool::Add( SbiSymDef* pDef )
|
||||
}
|
||||
}
|
||||
|
||||
// Suchen eines Eintrags ueber den Namen. Es wird auch im Parent gesucht.
|
||||
|
||||
SbiSymDef* SbiSymPool::Find( const String& rName ) const
|
||||
{
|
||||
@ -221,7 +216,6 @@ SbiSymDef* SbiSymPool::Find( const String& rName ) const
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Suchen ueber ID-Nummer
|
||||
|
||||
SbiSymDef* SbiSymPool::FindId( sal_uInt16 n ) const
|
||||
{
|
||||
@ -237,7 +231,7 @@ SbiSymDef* SbiSymPool::FindId( sal_uInt16 n ) const
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Suchen ueber Position (ab 0)
|
||||
// find via position (from 0)
|
||||
|
||||
SbiSymDef* SbiSymPool::Get( sal_uInt16 n ) const
|
||||
{
|
||||
@ -264,12 +258,11 @@ sal_uInt32 SbiSymPool::Reference( const String& rName )
|
||||
SbiSymDef* p = Find( rName );
|
||||
if( !p )
|
||||
p = AddSym( rName );
|
||||
//Sicherheitshalber
|
||||
// to be sure
|
||||
pParser->aGen.GenStmnt();
|
||||
return p->Reference();
|
||||
}
|
||||
|
||||
// Alle offenen Referenzen anmaulen
|
||||
|
||||
void SbiSymPool::CheckRefs()
|
||||
{
|
||||
@ -283,7 +276,7 @@ void SbiSymPool::CheckRefs()
|
||||
|
||||
/***************************************************************************
|
||||
|*
|
||||
|* Symbol-Definitionen
|
||||
|* symbol definitions
|
||||
|*
|
||||
***************************************************************************/
|
||||
|
||||
@ -328,8 +321,6 @@ SbiConstDef* SbiSymDef::GetConstDef()
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Wenn der Name benoetigt wird, den aktuellen Namen
|
||||
// aus dem Stringpool nehmen
|
||||
|
||||
const String& SbiSymDef::GetName()
|
||||
{
|
||||
@ -338,7 +329,6 @@ const String& SbiSymDef::GetName()
|
||||
return aName;
|
||||
}
|
||||
|
||||
// Eintragen eines Datentyps
|
||||
|
||||
void SbiSymDef::SetType( SbxDataType t )
|
||||
{
|
||||
@ -358,9 +348,8 @@ void SbiSymDef::SetType( SbxDataType t )
|
||||
eType = t;
|
||||
}
|
||||
|
||||
// Aufbau einer Backchain, falls noch nicht definiert
|
||||
// Es wird der Wert zurueckgeliefert, der als Operand gespeichert
|
||||
// werden soll.
|
||||
// construct a backchain, if not yet defined
|
||||
// the value that shall be stored as an operand is returned
|
||||
|
||||
sal_uInt32 SbiSymDef::Reference()
|
||||
{
|
||||
@ -373,8 +362,6 @@ sal_uInt32 SbiSymDef::Reference()
|
||||
else return nChain;
|
||||
}
|
||||
|
||||
// Definition eines Symbols.
|
||||
// Hier wird der Backchain aufgeloest, falls vorhanden
|
||||
|
||||
sal_uInt32 SbiSymDef::Define()
|
||||
{
|
||||
@ -386,13 +373,13 @@ sal_uInt32 SbiSymDef::Define()
|
||||
return nChain;
|
||||
}
|
||||
|
||||
// Eine Symboldefinition kann einen eigenen Pool haben. Dies ist
|
||||
// der Fall bei Objekten und Prozeduren (lokale Variable)
|
||||
// A symbol definition may have its own pool. This is the caseDies ist
|
||||
// for objects and procedures (local variable)
|
||||
|
||||
SbiSymPool& SbiSymDef::GetPool()
|
||||
{
|
||||
if( !pPool )
|
||||
pPool = new SbiSymPool( pIn->pParser->aGblStrings, SbLOCAL ); // wird gedumpt
|
||||
pPool = new SbiSymPool( pIn->pParser->aGblStrings, SbLOCAL ); // is dumped
|
||||
return *pPool;
|
||||
}
|
||||
|
||||
@ -402,22 +389,22 @@ SbiSymScope SbiSymDef::GetScope() const
|
||||
}
|
||||
|
||||
|
||||
// Die Prozedur-Definition hat drei Pools:
|
||||
// 1) aParams: wird durch die Definition gefuellt. Enthaelt die Namen
|
||||
// der Parameter, wie sie innerhalb des Rumpfes verwendet werden.
|
||||
// Das erste Element ist der Returnwert.
|
||||
// 2) pPool: saemtliche lokale Variable
|
||||
// 3) aLabels: Labels
|
||||
// The procedure definition has three pools:
|
||||
// 1) aParams: is filled by the definition. Contains the
|
||||
// parameters' names, like they're used inside the body.
|
||||
// The first element is the return value.
|
||||
// 2) pPool: all local variables
|
||||
// 3) aLabels: labels
|
||||
|
||||
SbiProcDef::SbiProcDef( SbiParser* pParser, const String& rName,
|
||||
sal_Bool bProcDecl )
|
||||
: SbiSymDef( rName )
|
||||
, aParams( pParser->aGblStrings, SbPARAM ) // wird gedumpt
|
||||
, aLabels( pParser->aLclStrings, SbLOCAL ) // wird nicht gedumpt
|
||||
, aParams( pParser->aGblStrings, SbPARAM ) // is dumped
|
||||
, aLabels( pParser->aLclStrings, SbLOCAL ) // is not dumped
|
||||
, mbProcDecl( bProcDecl )
|
||||
{
|
||||
aParams.SetParent( &pParser->aPublics );
|
||||
pPool = new SbiSymPool( pParser->aGblStrings, SbLOCAL ); // Locals
|
||||
pPool = new SbiSymPool( pParser->aGblStrings, SbLOCAL );
|
||||
pPool->SetParent( &aParams );
|
||||
nLine1 =
|
||||
nLine2 = 0;
|
||||
@ -425,8 +412,8 @@ SbiProcDef::SbiProcDef( SbiParser* pParser, const String& rName,
|
||||
bPublic = sal_True;
|
||||
bCdecl = sal_False;
|
||||
bStatic = sal_False;
|
||||
// Fuer Returnwerte ist das erste Element der Parameterliste
|
||||
// immer mit dem Namen und dem Typ der Proc definiert
|
||||
// For return values the first element of the parameter
|
||||
// list is always defined with name and type of the proc
|
||||
aParams.AddSym( aName );
|
||||
}
|
||||
|
||||
@ -444,30 +431,29 @@ void SbiProcDef::SetType( SbxDataType t )
|
||||
aParams.Get( 0 )->SetType( eType );
|
||||
}
|
||||
|
||||
// Match mit einer Forward-Deklaration
|
||||
// Falls der Match OK ist, wird pOld durch this im Pool ersetzt
|
||||
// pOld wird immer geloescht!
|
||||
// match with a forward-declaration
|
||||
// if the match is OK, pOld is replaced by this in the pool
|
||||
// pOld is deleted in any case!
|
||||
|
||||
void SbiProcDef::Match( SbiProcDef* pOld )
|
||||
{
|
||||
SbiSymDef* po, *pn=NULL;
|
||||
// Parameter 0 ist der Funktionsname
|
||||
// parameter 0 is the function name
|
||||
sal_uInt16 i;
|
||||
for( i = 1; i < aParams.GetSize(); i++ )
|
||||
{
|
||||
po = pOld->aParams.Get( i );
|
||||
pn = aParams.Get( i );
|
||||
// Kein Typabgleich; das wird beim Laufen erledigt
|
||||
// aber ist sie evtl. mit zu wenigen Parametern aufgerufen
|
||||
// worden?
|
||||
// no type matching - that is done during running
|
||||
// but is it maybe called with too little parameters?
|
||||
if( !po && !pn->IsOptional() && !pn->IsParamArray() )
|
||||
break;
|
||||
po = pOld->aParams.Next();
|
||||
}
|
||||
// Wurden zu viele Parameter angegeben?
|
||||
|
||||
if( pn && i < aParams.GetSize() && pOld->pIn )
|
||||
{
|
||||
// Die ganze Zeile markieren
|
||||
// mark the whole line
|
||||
pOld->pIn->GetParser()->SetCol1( 0 );
|
||||
pOld->pIn->GetParser()->Error( SbERR_BAD_DECLARATION, aName );
|
||||
}
|
||||
|
@ -34,11 +34,11 @@
|
||||
|
||||
struct TokenTable { SbiToken t; const char *s; };
|
||||
|
||||
static short nToken; // Anzahl der Tokens
|
||||
static short nToken; // number of tokens
|
||||
|
||||
static TokenTable* pTokTable;
|
||||
|
||||
static TokenTable aTokTable_Basic [] = { // Token-Tabelle:
|
||||
static TokenTable aTokTable_Basic [] = {
|
||||
|
||||
{ CAT, "&" },
|
||||
{ MUL, "*" },
|
||||
@ -119,7 +119,7 @@ static TokenTable aTokTable_Basic [] = { // Token-Tabelle:
|
||||
{ IMP, "Imp" },
|
||||
{ IMPLEMENTS, "Implements" },
|
||||
{ _IN_, "In" },
|
||||
{ INPUT, "Input" }, // auch INPUT #
|
||||
{ INPUT, "Input" }, // also INPUT #
|
||||
{ TINTEGER, "Integer" },
|
||||
{ IS, "Is" },
|
||||
{ LET, "Let" },
|
||||
@ -188,7 +188,7 @@ static TokenTable aTokTable_Basic [] = { // Token-Tabelle:
|
||||
{ WHILE, "While" },
|
||||
{ WITH, "With" },
|
||||
{ WITHEVENTS, "WithEvents" },
|
||||
{ WRITE, "Write" }, // auch WRITE #
|
||||
{ WRITE, "Write" }, // also WRITE #
|
||||
{ XOR, "Xor" },
|
||||
{ NIL, "" }
|
||||
};
|
||||
@ -217,7 +217,7 @@ TokenLabelInfo::~TokenLabelInfo()
|
||||
}
|
||||
|
||||
|
||||
// Der Konstruktor ermittelt die Laenge der Token-Tabelle.
|
||||
// the constructor detects the length of the token table
|
||||
|
||||
SbiTokenizer::SbiTokenizer( const ::rtl::OUString& rSrc, StarBASIC* pb )
|
||||
: SbiScanner( rSrc, pb )
|
||||
@ -236,7 +236,6 @@ SbiTokenizer::~SbiTokenizer()
|
||||
{
|
||||
}
|
||||
|
||||
// Wiederablage (Pushback) eines Tokens. (Bis zu 2 Tokens)
|
||||
|
||||
void SbiTokenizer::Push( SbiToken t )
|
||||
{
|
||||
@ -263,7 +262,7 @@ void SbiTokenizer::Error( SbError code, SbiToken tok )
|
||||
Error( code );
|
||||
}
|
||||
|
||||
// Einlesen des naechsten Tokens, ohne dass das Token geschluckt wird
|
||||
// reading in the next token without absorbing it
|
||||
|
||||
SbiToken SbiTokenizer::Peek()
|
||||
{
|
||||
@ -280,12 +279,11 @@ SbiToken SbiTokenizer::Peek()
|
||||
return eCurTok = ePush;
|
||||
}
|
||||
|
||||
// Dies ist fuer die Decompilation.
|
||||
// Zahlen und Symbole liefern einen Leerstring zurueck.
|
||||
// For decompilation. Numbers and symbols return an empty string.
|
||||
|
||||
const String& SbiTokenizer::Symbol( SbiToken t )
|
||||
{
|
||||
// Zeichen-Token?
|
||||
// character token?
|
||||
if( t < FIRSTKWD )
|
||||
{
|
||||
aSym = (char) t;
|
||||
@ -312,15 +310,15 @@ const String& SbiTokenizer::Symbol( SbiToken t )
|
||||
return aSym;
|
||||
}
|
||||
|
||||
// Einlesen des naechsten Tokens und Ablage desselben
|
||||
// Tokens, die nicht in der Token-Tabelle vorkommen, werden
|
||||
// direkt als Zeichen zurueckgeliefert.
|
||||
// Einige Worte werden gesondert behandelt.
|
||||
// Reading in the next token and put it down.
|
||||
// Tokens that don't appear in the token table
|
||||
// are directly returned as a character.
|
||||
// Some words are treated in a special way.
|
||||
|
||||
SbiToken SbiTokenizer::Next()
|
||||
{
|
||||
if (bEof) return EOLN;
|
||||
// Schon eines eingelesen?
|
||||
// have read in one already?
|
||||
if( ePush != NIL )
|
||||
{
|
||||
eCurTok = ePush;
|
||||
@ -333,40 +331,35 @@ SbiToken SbiTokenizer::Next()
|
||||
}
|
||||
TokenTable *tp;
|
||||
|
||||
// Sonst einlesen:
|
||||
if( !NextSym() )
|
||||
{
|
||||
bEof = bEos = sal_True;
|
||||
return eCurTok = EOLN;
|
||||
}
|
||||
// Zeilenende?
|
||||
|
||||
if( aSym.GetBuffer()[0] == '\n' )
|
||||
{
|
||||
bEos = sal_True; return eCurTok = EOLN;
|
||||
}
|
||||
bEos = sal_False;
|
||||
|
||||
// Zahl?
|
||||
if( bNumber )
|
||||
return eCurTok = NUMBER;
|
||||
|
||||
// String?
|
||||
else if( ( eScanType == SbxDATE || eScanType == SbxSTRING ) && !bSymbol )
|
||||
return eCurTok = FIXSTRING;
|
||||
// Sonderfaelle von Zeichen, die zwischen "Z" und "a" liegen. ICompare()
|
||||
// wertet die Position dieser Zeichen unterschiedlich aus.
|
||||
// Special cases of characters that are between "Z" and "a". ICompare()
|
||||
// evaluates the position of these characters in different ways.
|
||||
else if( aSym.GetBuffer()[0] == '^' )
|
||||
return eCurTok = EXPON;
|
||||
else if( aSym.GetBuffer()[0] == '\\' )
|
||||
return eCurTok = IDIV;
|
||||
else
|
||||
{
|
||||
// Mit Typkennung oder ein Symbol und keine Keyword-Erkennung?
|
||||
// Dann kein Token-Test
|
||||
if( eScanType != SbxVARIANT
|
||||
|| ( !bKeywords && bSymbol ) )
|
||||
return eCurTok = SYMBOL;
|
||||
// Gueltiges Token?
|
||||
// valid token?
|
||||
short lb = 0;
|
||||
short ub = nToken-1;
|
||||
short delta;
|
||||
@ -375,23 +368,23 @@ SbiToken SbiTokenizer::Next()
|
||||
delta = (ub - lb) >> 1;
|
||||
tp = &pTokTable[ lb + delta ];
|
||||
StringCompare res = aSym.CompareIgnoreCaseToAscii( tp->s );
|
||||
// Gefunden?
|
||||
|
||||
if( res == COMPARE_EQUAL )
|
||||
goto special;
|
||||
// Groesser? Dann untere Haelfte
|
||||
|
||||
if( res == COMPARE_LESS )
|
||||
{
|
||||
if ((ub - lb) == 2) ub = lb;
|
||||
else ub = ub - delta;
|
||||
}
|
||||
// Kleiner? Dann obere Haelfte
|
||||
|
||||
else
|
||||
{
|
||||
if ((ub -lb) == 2) lb = ub;
|
||||
else lb = lb + delta;
|
||||
}
|
||||
} while( delta );
|
||||
// Symbol? Wenn nicht >= Token
|
||||
// Symbol? if not >= token
|
||||
sal_Unicode ch = aSym.GetBuffer()[0];
|
||||
if( !BasicSimpleCharClass::isAlpha( ch, bCompatible ) && !bSymbol )
|
||||
return eCurTok = (SbiToken) (ch & 0x00FF);
|
||||
@ -410,14 +403,14 @@ special:
|
||||
// END IF, CASE, SUB, DEF, FUNCTION, TYPE, CLASS, WITH
|
||||
if( tp->t == END )
|
||||
{
|
||||
// AB, 15.3.96, Spezialbehandlung fuer END, beim Peek() geht die
|
||||
// aktuelle Zeile verloren, daher alles merken und danach restaurieren
|
||||
// from 15.3.96, special treatment for END, at Peek() the current
|
||||
// time is lost, so memorize everything and restore after
|
||||
sal_uInt16 nOldLine = nLine;
|
||||
sal_uInt16 nOldCol = nCol;
|
||||
sal_uInt16 nOldCol1 = nCol1;
|
||||
sal_uInt16 nOldCol2 = nCol2;
|
||||
String aOldSym = aSym;
|
||||
SaveLine(); // pLine im Scanner sichern
|
||||
SaveLine(); // save pLine in the scanner
|
||||
|
||||
eCurTok = Peek();
|
||||
switch( eCurTok )
|
||||
@ -435,21 +428,20 @@ special:
|
||||
nCol1 = nOldCol1;
|
||||
if( eCurTok == END )
|
||||
{
|
||||
// Alles zuruecksetzen, damit Token nach END ganz neu gelesen wird
|
||||
// reset everything so that token is read completely newly after END
|
||||
ePush = NIL;
|
||||
nLine = nOldLine;
|
||||
nCol = nOldCol;
|
||||
nCol2 = nOldCol2;
|
||||
aSym = aOldSym;
|
||||
RestoreLine(); // pLine im Scanner restaurieren
|
||||
RestoreLine();
|
||||
}
|
||||
return eCurTok;
|
||||
}
|
||||
// Sind Datentypen Keywords?
|
||||
// Nur nach AS, sonst sind es Symbole!
|
||||
// Es gibt ja ERROR(), DATA(), STRING() etc.
|
||||
// are data types keywords?
|
||||
// there is ERROR(), DATA(), STRING() etc.
|
||||
eCurTok = tp->t;
|
||||
// AS: Datentypen sind Keywords
|
||||
// AS: data types are keywords
|
||||
if( tp->t == AS )
|
||||
bAs = sal_True;
|
||||
else
|
||||
@ -493,7 +485,6 @@ special:
|
||||
#pragma optimize("",off)
|
||||
#endif
|
||||
|
||||
// Kann das aktuell eingelesene Token ein Label sein?
|
||||
|
||||
sal_Bool SbiTokenizer::MayBeLabel( sal_Bool bNeedsColon )
|
||||
{
|
||||
@ -541,7 +532,7 @@ void SbiTokenizer::Hilite( SbTextPortions& rList )
|
||||
else
|
||||
aRes.eType = SB_PUNCTUATION;
|
||||
}
|
||||
// Die Folge xxx.Keyword sollte nicht als Kwd geflagt werden
|
||||
// the sequence xxx.Keyword should not be flagged as Kwd
|
||||
if( aRes.eType == SB_KEYWORD
|
||||
&& ( eLastTok == DOT|| eLastTok == EXCLAM ) )
|
||||
aRes.eType = SB_SYMBOL;
|
||||
|
@ -34,29 +34,29 @@
|
||||
|
||||
class SbiParser;
|
||||
|
||||
class SbiBuffer { // Code/Konstanten-Puffer:
|
||||
SbiParser* pParser; // fuer Fehlermeldungen
|
||||
char* pBuf; // Puffer-Pointer
|
||||
char* pCur; // aktueller Puffer-Pointer
|
||||
sal_uInt32 nOff; // aktuelles Offset
|
||||
sal_uInt32 nSize; // aktuelle Groesse
|
||||
short nInc; // Inkrement
|
||||
sal_Bool Check( sal_uInt16 ); // Buffergroesse testen
|
||||
class SbiBuffer {
|
||||
SbiParser* pParser; // for error messages
|
||||
char* pBuf;
|
||||
char* pCur;
|
||||
sal_uInt32 nOff;
|
||||
sal_uInt32 nSize;
|
||||
short nInc;
|
||||
sal_Bool Check( sal_uInt16 );
|
||||
public:
|
||||
SbiBuffer( SbiParser*, short ); // Inkrement
|
||||
SbiBuffer( SbiParser*, short ); // increment
|
||||
~SbiBuffer();
|
||||
void Patch( sal_uInt32, sal_uInt32 ); // Patchen
|
||||
void Chain( sal_uInt32 ); // Back-Chain
|
||||
void Align( sal_Int32 ); // Alignment
|
||||
sal_Bool Add( const void*, sal_uInt16 );// Element anfuegen
|
||||
sal_Bool operator += (const String&);// Basic-String speichern
|
||||
sal_Bool operator += (sal_Int8); // Zeichen speichern
|
||||
sal_Bool operator += (sal_Int16); // Integer speichern
|
||||
sal_Bool operator += (sal_uInt8); // Zeichen speichern
|
||||
sal_Bool operator += (sal_uInt16); // Integer speichern
|
||||
sal_Bool operator += (sal_uInt32); // Integer speichern
|
||||
sal_Bool operator += (sal_Int32); // Integer speichern
|
||||
char* GetBuffer(); // Puffer rausgeben (selbst loeschen!)
|
||||
void Patch( sal_uInt32, sal_uInt32 );
|
||||
void Chain( sal_uInt32 );
|
||||
void Align( sal_Int32 );
|
||||
sal_Bool Add( const void*, sal_uInt16 );
|
||||
sal_Bool operator += (const String&); // save basic-string
|
||||
sal_Bool operator += (sal_Int8); // save character
|
||||
sal_Bool operator += (sal_Int16); // save integer
|
||||
sal_Bool operator += (sal_uInt8); // save character
|
||||
sal_Bool operator += (sal_uInt16); // save integer
|
||||
sal_Bool operator += (sal_uInt32); // save integer
|
||||
sal_Bool operator += (sal_Int32); // save integer
|
||||
char* GetBuffer(); // give out buffer (delete yourself!)
|
||||
char* GetBufferPtr(){ return pBuf; }
|
||||
sal_uInt32 GetSize() { return nOff; }
|
||||
};
|
||||
|
@ -35,13 +35,13 @@ class SbModule;
|
||||
#include "opcodes.hxx"
|
||||
#include "buffer.hxx"
|
||||
|
||||
class SbiCodeGen { // Code-Erzeugung:
|
||||
SbiParser* pParser; // fuer Fehlermeldungen, Line, Column etc.
|
||||
SbModule& rMod; // aktuelles Modul
|
||||
SbiBuffer aCode; // Code-Puffer
|
||||
short nLine, nCol; // Zeile, Spalte fuer Stmnt-Befehl
|
||||
short nForLevel; // #29955 for-Schleifen-Ebene
|
||||
sal_Bool bStmnt; // sal_True: Statement-Opcode liegt an
|
||||
class SbiCodeGen {
|
||||
SbiParser* pParser; // for error messages, line, column etc.
|
||||
SbModule& rMod;
|
||||
SbiBuffer aCode;
|
||||
short nLine, nCol; // for stmnt command
|
||||
short nForLevel; // #29955
|
||||
sal_Bool bStmnt; // sal_True: statement-opcode is pending
|
||||
public:
|
||||
SbiCodeGen( SbModule&, SbiParser*, short );
|
||||
SbiParser* GetParser() { return pParser; }
|
||||
@ -52,12 +52,12 @@ public:
|
||||
void Patch( sal_uInt32 o, sal_uInt32 v ){ aCode.Patch( o, v ); }
|
||||
void BackChain( sal_uInt32 off ) { aCode.Chain( off ); }
|
||||
void Statement();
|
||||
void GenStmnt(); // evtl. Statement-Opcode erzeugen
|
||||
void GenStmnt(); // create statement-opcode maybe
|
||||
sal_uInt32 GetPC();
|
||||
sal_uInt32 GetOffset() { return GetPC() + 1; }
|
||||
void Save();
|
||||
|
||||
// #29955 for-Schleifen-Ebene pflegen
|
||||
// #29955 service for-loop-level
|
||||
void IncForLevel( void ) { nForLevel++; }
|
||||
void DecForLevel( void ) { nForLevel--; }
|
||||
|
||||
|
@ -31,10 +31,10 @@
|
||||
|
||||
#include <basic/sbxobj.hxx>
|
||||
|
||||
// Das Sample-Element ist ein kleines Objekt, das die Properties
|
||||
// Name und Value enth„lt sowie die Methode Say, die den <20>bergebenen
|
||||
// Text mit dem eigenen Namen verkoppelt. Der Name ist von aussen setzbar.
|
||||
// Die Implementation arbeitet ausschliesslich mit dynamischen Elementen.
|
||||
// The sample-element is a small object that contains the
|
||||
// properties name and value and the method Say which couples
|
||||
// the passed text with its own name. The name can be set from
|
||||
// outside. Implementation works with dynamic elements only.
|
||||
|
||||
class SampleElement : public SbxObject
|
||||
{
|
||||
|
@ -37,19 +37,19 @@ class SvStream;
|
||||
class SbiDisas {
|
||||
const SbiImage& rImg;
|
||||
SbModule* pMod;
|
||||
char cLabels[ MAX_LABELS ]; // Bitvektor fuer Labels
|
||||
sal_uInt32 nOff; // aktuelle Position
|
||||
sal_uInt32 nPC; // Position des Opcodes
|
||||
SbiOpcode eOp; // Opcode
|
||||
sal_uInt32 nOp1, nOp2; // Operanden
|
||||
sal_uInt32 nParts; // 1, 2 oder 3
|
||||
sal_uInt32 nLine; // aktuelle Zeile
|
||||
char cLabels[ MAX_LABELS ]; // bit vector for labels
|
||||
sal_uInt32 nOff; // current position
|
||||
sal_uInt32 nPC; // position of the opcode
|
||||
SbiOpcode eOp; // opcode
|
||||
sal_uInt32 nOp1, nOp2; // operands
|
||||
sal_uInt32 nParts; // 1, 2 or 3
|
||||
sal_uInt32 nLine; // current line
|
||||
sal_Bool DisasLine( String& );
|
||||
sal_Bool Fetch(); // naechster Opcode
|
||||
sal_Bool Fetch(); // next opcode
|
||||
public:
|
||||
SbiDisas( SbModule*, const SbiImage* );
|
||||
void Disas( String& );
|
||||
// NICHT AUFRUFEN
|
||||
// DO NOT CALL
|
||||
void StrOp( String& );
|
||||
void Str2Op( String& );
|
||||
void ImmOp( String& );
|
||||
|
@ -46,10 +46,10 @@ class SbiProcDef;
|
||||
#include <vector>
|
||||
typedef ::std::vector<SbiExprList*> SbiExprListVector;
|
||||
|
||||
struct SbVar { // Variablen-Element:
|
||||
SbiExprNode* pNext; // Weiteres Element (bei Strukturen)
|
||||
SbiSymDef* pDef; // Symboldefinition
|
||||
SbiExprList* pPar; // optionale Parameter (wird geloescht)
|
||||
struct SbVar {
|
||||
SbiExprNode* pNext; // next element (for structures)
|
||||
SbiSymDef* pDef; // symbol definition
|
||||
SbiExprList* pPar; // optional parameters (is deleted)
|
||||
SbiExprListVector* pvMorePar; // Array of arrays foo(pPar)(avMorePar[0])(avMorePar[1])...
|
||||
};
|
||||
|
||||
@ -60,11 +60,11 @@ struct KeywordSymbolInfo
|
||||
SbiToken m_eTok;
|
||||
};
|
||||
|
||||
enum SbiExprType { // Expression-Typen:
|
||||
SbSTDEXPR, // normaler Ausdruck
|
||||
SbLVALUE, // beliebiger lValue
|
||||
SbSYMBOL, // beliebiges zusammengesetztes Symbol
|
||||
SbOPERAND // Variable/Funktion
|
||||
enum SbiExprType { // expression types:
|
||||
SbSTDEXPR, // normal expression
|
||||
SbLVALUE, // any lValue
|
||||
SbSYMBOL, // any composite symbol
|
||||
SbOPERAND // variable/function
|
||||
};
|
||||
|
||||
enum SbiExprMode { // Expression context:
|
||||
@ -79,9 +79,9 @@ enum SbiExprMode { // Expression context:
|
||||
};
|
||||
|
||||
enum SbiNodeType {
|
||||
SbxNUMVAL, // nVal = Wert
|
||||
SbxSTRVAL, // aStrVal = Wert, before #i59791/#i45570: nStringId = Wert
|
||||
SbxVARVAL, // aVar = Wert
|
||||
SbxNUMVAL, // nVal = value
|
||||
SbxSTRVAL, // aStrVal = value, before #i59791/#i45570: nStringId = value
|
||||
SbxVARVAL, // aVar = value
|
||||
SbxTYPEOF, // TypeOf ObjExpr Is Type
|
||||
SbxNODE, // Node
|
||||
SbxNEW, // new <type> expression
|
||||
@ -95,37 +95,37 @@ enum RecursiveMode
|
||||
PREVENT_CALL
|
||||
};
|
||||
|
||||
class SbiExprNode { // Operatoren (und Operanden)
|
||||
class SbiExprNode { // operators (and operands)
|
||||
friend class SbiExpression;
|
||||
friend class SbiConstExpression;
|
||||
union {
|
||||
sal_uInt16 nTypeStrId; // gepoolter String-ID, #i59791/#i45570 Now only for TypeOf
|
||||
double nVal; // numerischer Wert
|
||||
SbVar aVar; // oder Variable
|
||||
sal_uInt16 nTypeStrId; // pooled String-ID, #i59791/#i45570 Now only for TypeOf
|
||||
double nVal; // numeric value
|
||||
SbVar aVar; // or variable
|
||||
};
|
||||
String aStrVal; // #i59791/#i45570 Store string directly
|
||||
SbiExprNode* pLeft; // linker Zweig
|
||||
SbiExprNode* pRight; // rechter Zweig (NULL bei unaeren Ops)
|
||||
SbiExprNode* pWithParent; // Knoten, dessen Member this per with ist
|
||||
SbiCodeGen* pGen; // Code-Generator
|
||||
SbiNodeType eNodeType; // Art des Nodes
|
||||
SbxDataType eType; // aktueller Datentyp
|
||||
SbiToken eTok; // Token des Operators
|
||||
sal_Bool bComposite; // sal_True: Zusammengesetzter Ausdruck
|
||||
sal_Bool bError; // sal_True: Fehlerhaft
|
||||
void FoldConstants(); // Constant Folding durchfuehren
|
||||
void CollectBits(); // Umwandeln von Zahlen in Strings
|
||||
sal_Bool IsOperand() // sal_True, wenn Operand
|
||||
SbiExprNode* pLeft; // right branch
|
||||
SbiExprNode* pRight; // right branch (NULL for unary ops)
|
||||
SbiExprNode* pWithParent; // node, whose member is "this per with"
|
||||
SbiCodeGen* pGen; // code-generator
|
||||
SbiNodeType eNodeType;
|
||||
SbxDataType eType;
|
||||
SbiToken eTok;
|
||||
sal_Bool bComposite; // sal_True: composite expression
|
||||
sal_Bool bError; // sal_True: error
|
||||
void FoldConstants();
|
||||
void CollectBits(); // converting numbers to strings
|
||||
sal_Bool IsOperand()
|
||||
{ return sal_Bool( eNodeType != SbxNODE && eNodeType != SbxTYPEOF && eNodeType != SbxNEW ); }
|
||||
sal_Bool IsTypeOf()
|
||||
{ return sal_Bool( eNodeType == SbxTYPEOF ); }
|
||||
sal_Bool IsNew()
|
||||
{ return sal_Bool( eNodeType == SbxNEW ); }
|
||||
sal_Bool IsNumber(); // sal_True bei Zahlen
|
||||
sal_Bool IsString(); // sal_True bei Strings
|
||||
sal_Bool IsLvalue(); // sal_True, falls als Lvalue verwendbar
|
||||
void GenElement( SbiOpcode ); // Element
|
||||
void BaseInit( SbiParser* p ); // Hilfsfunktion fuer Ctor, AB 17.12.95
|
||||
sal_Bool IsNumber();
|
||||
sal_Bool IsString();
|
||||
sal_Bool IsLvalue(); // sal_True, if usable as Lvalue
|
||||
void GenElement( SbiOpcode );
|
||||
void BaseInit( SbiParser* p ); // help function for Ctor, from 17.12.95
|
||||
public:
|
||||
SbiExprNode( void );
|
||||
SbiExprNode( SbiParser*, double, SbxDataType );
|
||||
@ -137,10 +137,10 @@ public:
|
||||
virtual ~SbiExprNode();
|
||||
|
||||
sal_Bool IsValid() { return sal_Bool( !bError ); }
|
||||
sal_Bool IsConstant() // sal_True bei konstantem Operanden
|
||||
sal_Bool IsConstant() // sal_True constant operand
|
||||
{ return sal_Bool( eNodeType == SbxSTRVAL || eNodeType == SbxNUMVAL ); }
|
||||
sal_Bool IsIntConst(); // sal_True bei Integer-Konstanten
|
||||
sal_Bool IsVariable(); // sal_True, wenn Variable
|
||||
sal_Bool IsIntConst();
|
||||
sal_Bool IsVariable();
|
||||
|
||||
SbiExprNode* GetWithParent() { return pWithParent; }
|
||||
void SetWithParent( SbiExprNode* p ) { pWithParent = p; }
|
||||
@ -148,33 +148,33 @@ public:
|
||||
SbxDataType GetType() { return eType; }
|
||||
void SetType( SbxDataType eTp ) { eType = eTp; }
|
||||
SbiNodeType GetNodeType() { return eNodeType; }
|
||||
SbiSymDef* GetVar(); // Variable (falls vorhanden)
|
||||
SbiSymDef* GetRealVar(); // letzte Variable in x.y.z
|
||||
SbiExprNode* GetRealNode(); // letzter Knoten in x.y.z
|
||||
short GetDepth(); // Tiefe eines Baumes berechnen
|
||||
SbiSymDef* GetVar();
|
||||
SbiSymDef* GetRealVar(); // last variable in x.y.z
|
||||
SbiExprNode* GetRealNode(); // last node in x.y.z
|
||||
short GetDepth(); // compute a tree's depth
|
||||
const String& GetString() { return aStrVal; }
|
||||
short GetNumber() { return (short)nVal; }
|
||||
SbiExprList* GetParameters() { return aVar.pPar; }
|
||||
SbiExprListVector* GetMoreParameters() { return aVar.pvMorePar; }
|
||||
|
||||
void Optimize(); // Baumabgleich
|
||||
void Optimize(); // tree matching
|
||||
|
||||
void Gen( RecursiveMode eRecMode = UNDEFINED ); // Ausgabe eines Nodes
|
||||
void Gen( RecursiveMode eRecMode = UNDEFINED ); // giving out a node
|
||||
};
|
||||
|
||||
class SbiExpression { // der Ausdruck:
|
||||
class SbiExpression {
|
||||
friend class SbiExprList;
|
||||
friend class SbiParameters;
|
||||
friend class SbiDimList;
|
||||
protected:
|
||||
String aArgName; // Name fuer bananntes Argument
|
||||
SbiParser* pParser; // fuer Fehlermeldungen, Parsing
|
||||
SbiExpression* pNext; // Link bei Parameterlisten
|
||||
SbiExprNode* pExpr; // Der Expression-Baum
|
||||
SbiExprType eCurExpr; // Art des Ausdrucks
|
||||
SbiExprMode m_eMode; // Expression context
|
||||
sal_Bool bBased; // sal_True: einfacher DIM-Teil (+BASE)
|
||||
sal_Bool bError; // sal_True: Fehler
|
||||
String aArgName;
|
||||
SbiParser* pParser;
|
||||
SbiExpression* pNext; // link at parameter lists
|
||||
SbiExprNode* pExpr; // expression tree
|
||||
SbiExprType eCurExpr; // type of expression
|
||||
SbiExprMode m_eMode; // expression context
|
||||
sal_Bool bBased; // sal_True: easy DIM-part (+BASE)
|
||||
sal_Bool bError;
|
||||
sal_Bool bByVal; // sal_True: ByVal-Parameter
|
||||
sal_Bool bBracket; // sal_True: Parameter list with brackets
|
||||
sal_uInt16 nParenLevel;
|
||||
@ -199,11 +199,11 @@ protected:
|
||||
SbiExprNode* Boolean();
|
||||
public:
|
||||
SbiExpression( SbiParser*, SbiExprType = SbSTDEXPR,
|
||||
SbiExprMode eMode = EXPRMODE_STANDARD, const KeywordSymbolInfo* pKeywordSymbolInfo = NULL ); // Parsender Ctor
|
||||
SbiExprMode eMode = EXPRMODE_STANDARD, const KeywordSymbolInfo* pKeywordSymbolInfo = NULL ); // parsing Ctor
|
||||
SbiExpression( SbiParser*, const String& );
|
||||
SbiExpression( SbiParser*, double, SbxDataType = SbxDOUBLE );
|
||||
SbiExpression( SbiParser*, const SbiSymDef&, SbiExprList* = NULL );
|
||||
SbiExpression( SbiParser*, SbiToken ); // Spezial-Expr mit Spezial-Tokens
|
||||
SbiExpression( SbiParser*, SbiToken ); // special expr with special tokens
|
||||
~SbiExpression();
|
||||
String& GetName() { return aArgName; }
|
||||
void SetBased() { bBased = sal_True; }
|
||||
@ -222,14 +222,14 @@ public:
|
||||
SbiExprNode* GetExprNode() { return pExpr; }
|
||||
SbxDataType GetType() { return pExpr->GetType(); }
|
||||
void SetType( SbxDataType eType){ pExpr->eType = eType; }
|
||||
void Gen( RecursiveMode eRecMode = UNDEFINED ); // Ausgabe eines Nodes
|
||||
void Gen( RecursiveMode eRecMode = UNDEFINED );
|
||||
};
|
||||
|
||||
class SbiConstExpression : public SbiExpression {
|
||||
double nVal;
|
||||
String aVal;
|
||||
SbxDataType eType;
|
||||
public: // numerische Konstante
|
||||
public: // numeric constant
|
||||
SbiConstExpression( SbiParser* );
|
||||
SbxDataType GetType() { return eType; }
|
||||
const String& GetString() { return aVal; }
|
||||
@ -237,14 +237,14 @@ public: // numerische Konstante
|
||||
short GetShortValue();
|
||||
};
|
||||
|
||||
class SbiExprList { // Basisklasse fuer Parameter und Dims
|
||||
class SbiExprList { // base class for parameters and dims
|
||||
protected:
|
||||
SbiParser* pParser; // Parser
|
||||
SbiExpression* pFirst; // Expressions
|
||||
short nExpr; // Anzahl Expressions
|
||||
short nDim; // Anzahl Dimensionen
|
||||
sal_Bool bError; // sal_True: Fehler
|
||||
sal_Bool bBracket; // sal_True: Klammern
|
||||
SbiParser* pParser;
|
||||
SbiExpression* pFirst;
|
||||
short nExpr;
|
||||
short nDim;
|
||||
sal_Bool bError;
|
||||
sal_Bool bBracket;
|
||||
public:
|
||||
SbiExprList( SbiParser* );
|
||||
virtual ~SbiExprList();
|
||||
@ -253,20 +253,20 @@ public:
|
||||
short GetSize() { return nExpr; }
|
||||
short GetDims() { return nDim; }
|
||||
SbiExpression* Get( short );
|
||||
sal_Bool Test( const SbiProcDef& ); // Parameter-Checks
|
||||
void Gen(); // Code-Erzeugung
|
||||
sal_Bool Test( const SbiProcDef& ); // parameter checks
|
||||
void Gen(); // code generation
|
||||
void addExpression( SbiExpression* pExpr );
|
||||
};
|
||||
|
||||
class SbiParameters : public SbiExprList {
|
||||
public:
|
||||
SbiParameters( SbiParser*, sal_Bool bConst = sal_False, sal_Bool bPar = sal_True);// parsender Ctor
|
||||
SbiParameters( SbiParser*, sal_Bool bConst = sal_False, sal_Bool bPar = sal_True);// parsing Ctor
|
||||
};
|
||||
|
||||
class SbiDimList : public SbiExprList {
|
||||
sal_Bool bConst; // sal_True: Alles sind Integer-Konstanten
|
||||
sal_Bool bConst; // sal_True: everything integer constants
|
||||
public:
|
||||
SbiDimList( SbiParser* ); // Parsender Ctor
|
||||
SbiDimList( SbiParser* ); // parsing Ctor
|
||||
sal_Bool IsConstant() { return bConst; }
|
||||
};
|
||||
|
||||
|
@ -33,36 +33,36 @@
|
||||
|
||||
class SvStream;
|
||||
|
||||
// Version 2: Datentyp des Returnwerts fuer Publics
|
||||
// Version 3: neue Opcodes
|
||||
// Version 4: neue Opcodes
|
||||
// Version 5: Bug (Ansprung von STATIC-Variablen im Init-Code)
|
||||
// Version 6: Neue Opcodes und Bug (Globals anlegen, ohne BASIC zu beenden)
|
||||
// Version 7: Korrektur im WITH-Parsing
|
||||
// Version 8: Korrektur im IF-Parsing
|
||||
// Version 9: Init-Code auch mit LEAVE beenden, wenn keine SUB/FUNCTION folgt
|
||||
// Version A: #36374 Bei DIM AS NEW... auch Variablen anlegen
|
||||
// Version B: #40689 Static umgestellt
|
||||
// Version C: #41606 Bug bei Static
|
||||
// Version D: #42678 Bug bei RTL-Function spc
|
||||
// Version E: #56204 DCREATE, um auch bei DIM AS NEW Arrays anzulegen
|
||||
// Version F: #57844 Einfuehrung von SvNumberformat::StringToDouble
|
||||
// Version 10: #29955 For-Schleifen-Level in Statement-PCodes generieren
|
||||
// Version 11: #29955 Wegen Build-Inkonsistenzen Neu-Compilieren erzwingen
|
||||
// Version 2: data type of the return value for publics
|
||||
// Version 3: new opcodes
|
||||
// Version 4: new opcodes
|
||||
// Version 5: bug (entry of STATIC-variables in the init code)
|
||||
// Version 6: new opcodes and bug (construct globals, without ending the BASIC)
|
||||
// Version 7: correction concerning the WITH-Parsing
|
||||
// Version 8: correction concerning the IF-Parsing
|
||||
// Version 9: end init code with LEAVE, too, if no SUB/FUNCTION follows
|
||||
// Version A: #36374 at DIM AS NEW... construct variable too
|
||||
// Version B: #40689 reorganized static
|
||||
// Version C: #41606 bug at static
|
||||
// Version D: #42678 bug at RTL-function spc
|
||||
// Version E: #56204 DCREATE, to also construct arrays at DIM AS NEW
|
||||
// Version F: #57844 introduction of SvNumberformat::StringToDouble
|
||||
// Version 10: #29955 generate for-loop-level in Statement-PCodes
|
||||
// Version 11: #29955 force anew compilation because of build-inconsistences
|
||||
|
||||
#define B_LEGACYVERSION 0x00000011L
|
||||
#define B_CURVERSION 0x00000012L
|
||||
#define B_EXT_IMG_VERSION 0x00000012L
|
||||
|
||||
// Eine Datei enthaelt entweder einen Modul- oder einen Library-Record.
|
||||
// Diese Records enthalten wiederum weitere Records. Jeder Record hat
|
||||
// den folgenden Header:
|
||||
// The file contains either a module- or a library-record.
|
||||
// Those records contain further records. Every record's got
|
||||
// the following header:
|
||||
|
||||
// sal_uInt16 Kennung
|
||||
// sal_uInt32 Laenge des Records ohne Header
|
||||
// sal_uInt16 Anzahl Unterelemente
|
||||
// sal_uInt16 identifier
|
||||
// sal_uInt32 the record's length without the header
|
||||
// sal_uInt16 number of sub-elements
|
||||
|
||||
// Alle Datei-Offsets in Records sind relativ zum Start des Moduls!
|
||||
// all the file-offsets in records are relative to the module's start!
|
||||
|
||||
#define B_LIBRARY 0x4C42 // BL Library Record
|
||||
#define B_MODULE 0x4D42 // BM Module Record
|
||||
@ -84,92 +84,92 @@ class SvStream;
|
||||
#define B_EXTSOURCE 0x5345 // ES extended source
|
||||
#endif
|
||||
|
||||
// Ein Library Record enthaelt nur Module Records
|
||||
// sal_uInt16 Kennung BL
|
||||
// sal_uInt32 Laenge des Records
|
||||
// sal_uInt16 Anzahl Module
|
||||
// A library record contains only module records
|
||||
// sal_uInt16 identifier BL
|
||||
// sal_uInt32 the record's length
|
||||
// sal_uInt16 number of modules
|
||||
|
||||
// Ein Modul-Record enthaelt alle anderen Recordtypen
|
||||
// sal_uInt16 Kennung BM
|
||||
// sal_uInt32 Laenge des Records
|
||||
// A module-record contains all the other record types
|
||||
// sal_uInt16 identifier BM
|
||||
// sal_uInt32 the record's length
|
||||
// sal_uInt16 1
|
||||
// Daten:
|
||||
// sal_uInt32 Versionsnummer
|
||||
// sal_uInt32 Zeichensatz
|
||||
// sal_uInt32 Startadresse Initialisierungscode
|
||||
// sal_uInt32 Startadresse Sub Main
|
||||
// sal_uInt32 Reserviert
|
||||
// sal_uInt32 Reserviert
|
||||
// Data:
|
||||
// sal_uInt32 version number
|
||||
// sal_uInt32 character set
|
||||
// sal_uInt32 starting address initialisation code
|
||||
// sal_uInt32 starting address sub main
|
||||
// sal_uInt32 reserved
|
||||
// sal_uInt32 reserved
|
||||
|
||||
// Modulname, Kommentar und Quellcode:
|
||||
// sal_uInt16 Kennung MN, MC oder SC
|
||||
// sal_uInt32 Laenge des Records
|
||||
// module name, comment and source code:
|
||||
// sal_uInt16 identifier MN, MC or SC
|
||||
// sal_uInt32 the record's length
|
||||
// sal_uInt16 1
|
||||
// Daten:
|
||||
// String-Instanz
|
||||
// Data:
|
||||
// string instance
|
||||
|
||||
// P-Code:
|
||||
// sal_uInt16 Kennung PC
|
||||
// sal_uInt32 Laenge des Records
|
||||
// sal_uInt16 identifier PC
|
||||
// sal_uInt32 the record's length
|
||||
// sal_uInt16 1
|
||||
// Daten:
|
||||
// Der P-Code als Bytesack
|
||||
// Data:
|
||||
// the P-Code as bytesack
|
||||
|
||||
// Alle Symbole und Strings werden in einem String-Pool gehalten.
|
||||
// Verweise auf diese Strings sind in Form eines Indexes in diesen Pool.
|
||||
// All symbols and strings are kept in a string-pool.
|
||||
// References to these strings are in this pool in the form of an index.
|
||||
|
||||
// Liste aller Publics:
|
||||
// sal_uInt16 Kennung PU oder Pu
|
||||
// sal_uInt32 Laenge des Records
|
||||
// sal_uInt16 Anzahl der Publics
|
||||
// Daten fuer jeden Public-Eintrag:
|
||||
// sal_uInt16 String-Index
|
||||
// sal_uInt32 Startadresse im P-Code-Image (sal_uInt16 fuer alte Publics)
|
||||
// sal_uInt16 Datentyp des Returnwertes (ab Version 2)
|
||||
// List of all publics:
|
||||
// sal_uInt16 identifier PU or Pu
|
||||
// sal_uInt32 the record's length
|
||||
// sal_uInt16 number of publics
|
||||
// Data for every public-entry:
|
||||
// sal_uInt16 string index
|
||||
// sal_uInt32 starting address in the p-code-image (sal_uInt16 for old publics)
|
||||
// sal_uInt16 data type of the return value (from version 2)
|
||||
|
||||
// Verzeichnis der Symbol-Tabellen:
|
||||
// sal_uInt16 Kennung SP
|
||||
// sal_uInt32 Laenge des Records
|
||||
// sal_uInt16 Anzahl der Symboltabellen
|
||||
// Daten fuer jede Symboltabelle:
|
||||
// sal_uInt16 Stringindex des Namens
|
||||
// sal_uInt16 Anzahl Symbole
|
||||
// sal_uInt16 Scope-Kennung
|
||||
// Register of the symbol tables:
|
||||
// sal_uInt16 identifier SP
|
||||
// sal_uInt32 the record's length
|
||||
// sal_uInt16 number of symbol tables
|
||||
// Data for every symbol table:
|
||||
// sal_uInt16 stringindex of the name
|
||||
// sal_uInt16 number of symbols
|
||||
// sal_uInt16 scope identifier
|
||||
|
||||
// Symboltabelle:
|
||||
// sal_uInt16 Kennung SY
|
||||
// sal_uInt32 Laenge des Records
|
||||
// sal_uInt16 Anzahl der Symbole
|
||||
// Daten:
|
||||
// sal_uInt16 Stringindex des Namens
|
||||
// sal_uInt16 Anzahl Symbole
|
||||
// Daten fuer jedes Symbol:
|
||||
// sal_uInt16 Stringindex des Namens
|
||||
// sal_uInt16 Datentyp
|
||||
// sal_uInt16 Laenge bei STRING*n-Symbolen (0x8000: STATIC-Variable)
|
||||
// symbol table:
|
||||
// sal_uInt16 identifier SY
|
||||
// sal_uInt32 the record's length
|
||||
// sal_uInt16 number of symbols
|
||||
// Data:
|
||||
// sal_uInt16 stringindex of the name
|
||||
// sal_uInt16 number of symbols
|
||||
// Data for every symbol:
|
||||
// sal_uInt16 stringindex of the name
|
||||
// sal_uInt16 data type
|
||||
// sal_uInt16 length for STRING*n-symbols (0x8000: STATIC variable)
|
||||
|
||||
// Stringpool:
|
||||
// sal_uInt16 Kennung ST
|
||||
// sal_uInt32 Laenge des Records
|
||||
// sal_uInt16 Anzahl der Strings
|
||||
// Daten fuer jeden String:
|
||||
// sal_uInt32 Offset in den Block aller Strings
|
||||
// Danach folgt der Block aller Strings, die dort als ASCIIZ-Strings liegen.
|
||||
// sal_uInt16 identifier ST
|
||||
// sal_uInt32 the record's length
|
||||
// sal_uInt16 number of strings
|
||||
// Data for every string:
|
||||
// sal_uInt32 Offset in the block of all strings
|
||||
// the block of all strings (ASCIIZ) follows then
|
||||
|
||||
// Line Ranges:
|
||||
// sal_uInt16 Kennung LR
|
||||
// sal_uInt32 Laenge des Records
|
||||
// sal_uInt16 Anzahl der Strings
|
||||
// Daten fuer jedes Public:
|
||||
// line ranges:
|
||||
// sal_uInt16 identifier LR
|
||||
// sal_uInt32 the record's length
|
||||
// sal_uInt16 number of strings
|
||||
// Data for every public:
|
||||
// sal_uInt16 1. Zeile (Sub XXX)
|
||||
// sal_uInt16 2. Zeile (End Sub)
|
||||
|
||||
// SBX-Objekte:
|
||||
// sal_uInt16 Anzahl Objekte
|
||||
// .... Objektdaten
|
||||
// SBX-objects:
|
||||
// sal_uInt16 number of objects
|
||||
// .... object data
|
||||
|
||||
|
||||
// Service-Routinen (in IMAGE.CXX)
|
||||
// service routines (in IMAGE.CXX)
|
||||
|
||||
sal_Bool SbGood( SvStream& r );
|
||||
sal_uIntPtr SbOpenRecord( SvStream&, sal_uInt16 nSignature, sal_uInt16 nElem );
|
||||
|
@ -33,13 +33,13 @@
|
||||
#include <rtl/ustring.hxx>
|
||||
#include <filefmt.hxx>
|
||||
|
||||
// Diese Klasse liest das vom Compiler erzeugte Image ein und verwaltet
|
||||
// den Zugriff auf die einzelnen Elemente.
|
||||
// This class reads in the image that's been produced by the compiler
|
||||
// and manages the access to the single elements.
|
||||
|
||||
struct SbPublicEntry;
|
||||
|
||||
class SbiImage {
|
||||
friend class SbiCodeGen; // Compiler-Klassen, die die private-
|
||||
friend class SbiCodeGen; // compiler classes, that the private-
|
||||
|
||||
SbxArrayRef rTypes; // User defined types
|
||||
SbxArrayRef rEnums; // Enum types
|
||||
@ -47,35 +47,35 @@ class SbiImage {
|
||||
sal_Unicode* pStrings; // StringPool
|
||||
char* pCode; // Code-Image
|
||||
char* pLegacyPCode; // Code-Image
|
||||
sal_Bool bError; // sal_True: Fehler
|
||||
sal_uInt16 nFlags; // Flags (s.u.)
|
||||
short nStrings; // Anzahl Strings
|
||||
sal_uInt32 nStringSize; // Groesse des String-Puffers
|
||||
sal_uInt32 nCodeSize; // Groesse des Code-Blocks
|
||||
sal_uInt16 nLegacyCodeSize; // Groesse des Code-Blocks
|
||||
sal_uInt16 nDimBase; // OPTION BASE-Wert
|
||||
rtl_TextEncoding eCharSet; // Zeichensatz fuer Strings
|
||||
// temporaere Verwaltungs-Variable:
|
||||
short nStringIdx; // aktueller String-Index
|
||||
sal_uInt32 nStringOff; // aktuelle Pos im Stringpuffer
|
||||
// Routinen fuer Compiler:
|
||||
void MakeStrings( short ); // StringPool einrichten
|
||||
void AddString( const String& );// String zufuegen
|
||||
void AddCode( char*, sal_uInt32 ); // Codeblock dazu
|
||||
void AddType(SbxObject *); // User-Type mit aufnehmen
|
||||
void AddEnum(SbxObject *); // Register enum type
|
||||
sal_Bool bError;
|
||||
sal_uInt16 nFlags;
|
||||
short nStrings;
|
||||
sal_uInt32 nStringSize;
|
||||
sal_uInt32 nCodeSize;
|
||||
sal_uInt16 nLegacyCodeSize;
|
||||
sal_uInt16 nDimBase; // OPTION BASE value
|
||||
rtl_TextEncoding eCharSet;
|
||||
// temporary management-variable:
|
||||
short nStringIdx;
|
||||
sal_uInt32 nStringOff; // current Pos in the stringbuffer
|
||||
// routines for the compiler:
|
||||
void MakeStrings( short ); // establish StringPool
|
||||
void AddString( const String& );
|
||||
void AddCode( char*, sal_uInt32 );
|
||||
void AddType(SbxObject *);
|
||||
void AddEnum(SbxObject *);
|
||||
|
||||
public:
|
||||
String aName; // Makroname
|
||||
::rtl::OUString aOUSource; // Quellcode
|
||||
String aComment; // Kommentar
|
||||
sal_Bool bInit; // sal_True: Init-Code ist gelaufen
|
||||
sal_Bool bFirstInit; // sal_True, wenn das Image das erste mal nach
|
||||
// dem Compilieren initialisiert wird.
|
||||
String aName; // macro name
|
||||
::rtl::OUString aOUSource; // source code
|
||||
String aComment;
|
||||
sal_Bool bInit;
|
||||
sal_Bool bFirstInit;
|
||||
|
||||
SbiImage();
|
||||
~SbiImage();
|
||||
void Clear(); // Inhalt loeschen
|
||||
sal_Bool Load( SvStream&, sal_uInt32& nVer ); // Loads image from stream
|
||||
void Clear();
|
||||
sal_Bool Load( SvStream&, sal_uInt32& nVer );
|
||||
// nVer is set to version
|
||||
// of image
|
||||
sal_Bool Load( SvStream& );
|
||||
@ -100,9 +100,9 @@ public:
|
||||
|
||||
};
|
||||
|
||||
#define SBIMG_EXPLICIT 0x0001 // OPTION EXPLICIT ist aktiv
|
||||
#define SBIMG_COMPARETEXT 0x0002 // OPTION COMPARE TEXT ist aktiv
|
||||
#define SBIMG_INITCODE 0x0004 // Init-Code vorhanden
|
||||
#define SBIMG_EXPLICIT 0x0001 // OPTION EXPLICIT is active
|
||||
#define SBIMG_COMPARETEXT 0x0002 // OPTION COMPARE TEXT is active
|
||||
#define SBIMG_INITCODE 0x0004 // Init-Code does exist
|
||||
#define SBIMG_CLASSMODULE 0x0008 // OPTION ClassModule is active
|
||||
|
||||
#endif
|
||||
|
@ -34,29 +34,28 @@
|
||||
|
||||
class SvStream;
|
||||
|
||||
// Zur Zeit sind globale Dateien (Kanalnummern 256 bis 511)
|
||||
// nicht implementiert.
|
||||
// Global files (channel numbers 256 to 511) are not
|
||||
// implemented at the moment.
|
||||
|
||||
#define CHANNELS 256
|
||||
#define CONSOLE 0
|
||||
|
||||
#define SBSTRM_INPUT 0x0001 // Input
|
||||
#define SBSTRM_OUTPUT 0x0002 // Output
|
||||
#define SBSTRM_RANDOM 0x0004 // Random
|
||||
#define SBSTRM_APPEND 0x0008 // Append
|
||||
#define SBSTRM_BINARY 0x0010 // Binary
|
||||
#define SBSTRM_INPUT 0x0001
|
||||
#define SBSTRM_OUTPUT 0x0002
|
||||
#define SBSTRM_RANDOM 0x0004
|
||||
#define SBSTRM_APPEND 0x0008
|
||||
#define SBSTRM_BINARY 0x0010
|
||||
|
||||
class SbiStream {
|
||||
SvStream* pStrm; // der Stream
|
||||
sal_uIntPtr nExpandOnWriteTo; // bei Schreibzugriff, den Stream
|
||||
// bis zu dieser Groesse aufblasen
|
||||
ByteString aLine; // aktuelle Zeile
|
||||
sal_uIntPtr nLine; // aktuelle Zeilennummer
|
||||
short nLen; // Pufferlaenge
|
||||
short nMode; // Bits:
|
||||
short nChan; // aktueller Kanal
|
||||
SbError nError; // letzter Fehlercode
|
||||
void MapError(); // Fehlercode mappen
|
||||
SvStream* pStrm;
|
||||
sal_uIntPtr nExpandOnWriteTo; // during writing access expand the stream to this size
|
||||
ByteString aLine;
|
||||
sal_uIntPtr nLine;
|
||||
short nLen; // buffer length
|
||||
short nMode;
|
||||
short nChan;
|
||||
SbError nError;
|
||||
void MapError();
|
||||
|
||||
public:
|
||||
SbiStream();
|
||||
@ -82,10 +81,10 @@ public:
|
||||
|
||||
class SbiIoSystem {
|
||||
SbiStream* pChan[ CHANNELS ];
|
||||
ByteString aPrompt; // Input-Prompt
|
||||
ByteString aIn, aOut; // Console-Buffer
|
||||
short nChan; // aktueller Kanal
|
||||
SbError nError; // letzter Fehlercode
|
||||
ByteString aPrompt;
|
||||
ByteString aIn, aOut;
|
||||
short nChan;
|
||||
SbError nError;
|
||||
void ReadCon( ByteString& );
|
||||
void WriteCon( const ByteString& );
|
||||
public:
|
||||
|
@ -34,27 +34,26 @@
|
||||
#include <basic/sbxobj.hxx>
|
||||
|
||||
// 1) Properties:
|
||||
// Name der Name, R/O
|
||||
// Value ein double-Wert, R/W
|
||||
// 2) Methoden:
|
||||
// Display Ausgabe eines Textes
|
||||
// Square Argument * Argument
|
||||
// Event Aufruf eines Basic-Programms
|
||||
// 3) Unterobjekte:
|
||||
// eine Collection names "Elements". Der Zugriff ist sowohl als
|
||||
// Property (fuer das gesamte Objekt) als auch als Methode (fuer
|
||||
// einzelne Elemente, wird durchgereicht) implementiert.
|
||||
// Diese Implementation ist ein Beispiel fuer eine tabellengesteuerte
|
||||
// Version, die sehr viele Elemente enthalten kann.
|
||||
// Die Collection findet sich in COLLECTN.*, die in der Collection
|
||||
// enthaltenen Objekte in COLLELEM.*
|
||||
// Name R/O
|
||||
// Value a double-value, R/W
|
||||
// 2) Methods:
|
||||
// Display display a text
|
||||
// Square argument * argument
|
||||
// Event call of a Basic-program
|
||||
// 3) Sub-objects:
|
||||
// a collection named "elements". The access is implemented as
|
||||
// property (for the whole object) and as method (for single
|
||||
// elements, is passed through).
|
||||
// This implementation is an example for a table controlled
|
||||
// version that can contain many elements.
|
||||
// The collection is located in COLLECTN.*, the collection's
|
||||
// objects in COLLELEM.*
|
||||
|
||||
class SampleObject : public SbxObject
|
||||
{
|
||||
using SbxVariable::GetInfo;
|
||||
// Definition eines Tabelleneintrags. Dies wird hier gemacht,
|
||||
// da dadurch die Methoden und Properties als private deklariert
|
||||
// werden koennen.
|
||||
// Definition of a table entry. This is done here because
|
||||
// methods and properties can be declared private that way.
|
||||
#if defined ( ICC ) || defined ( C50 )
|
||||
public:
|
||||
#endif
|
||||
@ -65,30 +64,29 @@ private:
|
||||
#endif
|
||||
|
||||
struct Methods {
|
||||
const char* pName; // Name des Eintrags
|
||||
SbxDataType eType; // Datentyp
|
||||
pMeth pFunc; // Function Pointer
|
||||
short nArgs; // Argumente und Flags
|
||||
const char* pName; // name of an entry
|
||||
SbxDataType eType; // data type
|
||||
pMeth pFunc;
|
||||
short nArgs; // arguments and flags
|
||||
};
|
||||
static Methods aMethods[]; // Methodentabelle
|
||||
static Methods aMethods[]; // method table
|
||||
|
||||
// Methoden
|
||||
// methods
|
||||
void Display( SbxVariable*, SbxArray*, sal_Bool );
|
||||
void Event( SbxVariable*, SbxArray*, sal_Bool );
|
||||
void Square( SbxVariable*, SbxArray*, sal_Bool );
|
||||
void Create( SbxVariable*, SbxArray*, sal_Bool );
|
||||
// Infoblock auffuellen
|
||||
// fill infoblock
|
||||
SbxInfo* GetInfo( short nIdx );
|
||||
// Broadcaster Notification
|
||||
virtual void SFX_NOTIFY( SfxBroadcaster& rBC, const TypeId& rBCType,
|
||||
const SfxHint& rHint, const TypeId& rHintType );
|
||||
public:
|
||||
SampleObject( const String& );
|
||||
// Suchen eines Elements
|
||||
|
||||
virtual SbxVariable* Find( const String&, SbxClassType );
|
||||
};
|
||||
|
||||
// Die dazugehoerige Factory:
|
||||
|
||||
class SampleObjectFac : public SbxFactory
|
||||
{
|
||||
|
@ -31,60 +31,60 @@
|
||||
|
||||
#include "sbintern.hxx"
|
||||
|
||||
// Ein Opcode ist entweder 1, 3 oder 5 Bytes lang, je nach numerischen
|
||||
// Wert des Opcodes (s.u.).
|
||||
// An opcode can have a length of 1, 3 or 5 bytes,
|
||||
// depending on its numeric value (see below).
|
||||
|
||||
enum SbiOpcode {
|
||||
// Alle Opcodes ohne Operanden
|
||||
// all opcodes without operands
|
||||
_NOP = 0,
|
||||
|
||||
SbOP0_START = _NOP,
|
||||
|
||||
// Operatoren
|
||||
// die folgenden Operatoren sind genauso angeordnet
|
||||
// wie der enum SbxVarOp
|
||||
// operators
|
||||
// the following operators are ordered
|
||||
// the same way as the enum SbxVarOp
|
||||
_EXP, _MUL, _DIV, _MOD, _PLUS, _MINUS, _NEG,
|
||||
_EQ, _NE, _LT, _GT, _LE, _GE,
|
||||
_IDIV, _AND, _OR, _XOR, _EQV, _IMP, _NOT,
|
||||
_CAT,
|
||||
// Ende enum SbxVarOp
|
||||
// end of enum SbxVarOp
|
||||
_LIKE, _IS,
|
||||
// Laden/speichern
|
||||
_ARGC, // neuen Argv einrichten
|
||||
_ARGV, // TOS ==> aktueller Argv
|
||||
// load/save
|
||||
_ARGC, // establish new Argv
|
||||
_ARGV, // TOS ==> current Argv
|
||||
_INPUT, // Input ==> TOS
|
||||
_LINPUT, // Line Input ==> TOS
|
||||
_GET, // TOS anfassen
|
||||
_SET, // Speichern Objekt TOS ==> TOS-1
|
||||
_GET, // touch TOS
|
||||
_SET, // save object TOS ==> TOS-1
|
||||
_PUT, // TOS ==> TOS-1
|
||||
_PUTC, // TOS ==> TOS-1, dann ReadOnly
|
||||
_PUTC, // TOS ==> TOS-1, then ReadOnly
|
||||
_DIM, // DIM
|
||||
_REDIM, // REDIM
|
||||
_REDIMP, // REDIM PRESERVE
|
||||
_ERASE, // TOS loeschen
|
||||
// Verzweigen
|
||||
_STOP, // Programmende
|
||||
_INITFOR, // FOR-Variable initialisieren
|
||||
_NEXT, // FOR-Variable inkrementieren
|
||||
_CASE, // Anfang CASE
|
||||
_ENDCASE, // Ende CASE
|
||||
_STDERROR, // Standard-Fehlerbehandlung
|
||||
_NOERROR, // keine Fehlerbehandlung
|
||||
_LEAVE, // UP verlassen
|
||||
_ERASE, // delete TOS
|
||||
// branch
|
||||
_STOP, // end of program
|
||||
_INITFOR, // initialize FOR-variable
|
||||
_NEXT, // increment FOR-variable
|
||||
_CASE, // beginning CASE
|
||||
_ENDCASE, // end CASE
|
||||
_STDERROR, // standard error handling
|
||||
_NOERROR, // no error handling
|
||||
_LEAVE, // leave UP
|
||||
// E/A
|
||||
_CHANNEL, // TOS = Kanalnummer
|
||||
_CHANNEL, // TOS = channel number
|
||||
_BPRINT, // print TOS
|
||||
_PRINTF, // print TOS in field
|
||||
_BWRITE, // write TOS
|
||||
_RENAME, // Rename Tos+1 to Tos
|
||||
_PROMPT, // TOS = Prompt for Input
|
||||
_RESTART, // Restartpunkt definieren
|
||||
_CHAN0, // I/O-Kanal 0
|
||||
// Sonstiges
|
||||
_EMPTY, // Leeren Ausdruck auf Stack
|
||||
_ERROR, // TOS = Fehlercode
|
||||
_LSET, // Speichern Objekt TOS ==> TOS-1
|
||||
_RSET, // Speichern Objekt TOS ==> TOS-1
|
||||
_RESTART, // define restart point
|
||||
_CHAN0, // I/O-channel 0
|
||||
// miscellaneous
|
||||
_EMPTY, // empty expression on stack
|
||||
_ERROR, // TOS = error code
|
||||
_LSET, // saving object TOS ==> TOS-1
|
||||
_RSET, // saving object TOS ==> TOS-1
|
||||
_REDIMP_ERASE, // Copies array to be later used by REDIM PRESERVE before erasing it
|
||||
_INITFOREACH,
|
||||
_VBASET, // VBA-like Set
|
||||
@ -94,70 +94,70 @@ enum SbiOpcode {
|
||||
|
||||
SbOP0_END = _BYVAL,
|
||||
|
||||
// Alle Opcodes mit einem Operanden
|
||||
// all opcodes with one operand
|
||||
|
||||
_NUMBER = 0x40, // Laden einer numerischen Konstanten (+ID)
|
||||
_NUMBER = 0x40, // loading a numeric constant (+ID)
|
||||
|
||||
SbOP1_START = _NUMBER,
|
||||
|
||||
_SCONST, // Laden einer Stringkonstanten (+ID)
|
||||
_CONST, // Immediate Load (+Wert)
|
||||
_ARGN, // Speichern eines named Args in Argv (+StringID)
|
||||
_PAD, // String auf feste Laenge bringen (+Laenge)
|
||||
_SCONST, // loading a stringconstant (+ID)
|
||||
_CONST, // Immediate Load (+ value)
|
||||
_ARGN, // saving a named Arg in Argv (+StringID)
|
||||
_PAD, // bring string to a firm length (+length)
|
||||
// Verzweigungen
|
||||
_JUMP, // Sprung (+Target)
|
||||
_JUMPT, // TOS auswerten, bedingter Sprung (+Target)
|
||||
_JUMPF, // TOS auswerten, bedingter Sprung (+Target)
|
||||
_ONJUMP, // TOS auswerten, Sprung in JUMP-Tabelle (+MaxVal)
|
||||
_GOSUB, // UP-Aufruf (+Target)
|
||||
_RETURN, // UP-Return (+0 oder Target)
|
||||
_TESTFOR, // FOR-Variable testen, inkrementieren (+Endlabel)
|
||||
_JUMP, // jump (+target)
|
||||
_JUMPT, // evaluate TOS, conditional jump (+target)
|
||||
_JUMPF, // evaluate TOS, conditional jump (+target)
|
||||
_ONJUMP, // evaluate TOS, jump into JUMP-table (+MaxVal)
|
||||
_GOSUB, // UP-call (+Target)
|
||||
_RETURN, // UP-return (+0 or Target)
|
||||
_TESTFOR, // test FOR-variable, increment (+Endlabel)
|
||||
_CASETO, // Tos+1 <= Case <= Tos, 2xremove (+Target)
|
||||
_ERRHDL, // Fehler-Handler (+Offset)
|
||||
_RESUME, // Resume nach Fehlern (+0 or 1 or Label)
|
||||
_ERRHDL, // error handler (+Offset)
|
||||
_RESUME, // Resume after errors (+0 or 1 or Label)
|
||||
// E/A
|
||||
_CLOSE, // (+Kanal/0)
|
||||
_CLOSE, // (+channel/0)
|
||||
_PRCHAR, // (+char)
|
||||
// Verwaltung
|
||||
_SETCLASS, // Set + Klassennamen testen (+StringId)
|
||||
_SETCLASS, // test set + class names (+StringId)
|
||||
_TESTCLASS, // Check TOS class (+StringId)
|
||||
_LIB, // Libnamen fuer Declare-Procs setzen (+StringId)
|
||||
_BASED, // TOS wird um BASE erhoeht, BASE davor gepusht (+base)
|
||||
// Typanpassung im Argv
|
||||
_ARGTYP, // Letzten Parameter in Argv konvertieren (+Typ)
|
||||
_LIB, // set lib name for declar-procs (+StringId)
|
||||
_BASED, // TOS is incremented by BASE, BASE is pushed before (+base)
|
||||
// type adjustment in the Argv
|
||||
_ARGTYP, // convert last parameter in Argv (+type)
|
||||
_VBASETCLASS, // VBA-like Set
|
||||
|
||||
SbOP1_END = _VBASETCLASS,
|
||||
|
||||
// Alle Opcodes mit zwei Operanden
|
||||
// all opcodes with two operands
|
||||
|
||||
_RTL = 0x80, // Laden aus RTL (+StringID+Typ)
|
||||
_RTL = 0x80, // load from the RTL (+StringID+Typ)
|
||||
|
||||
SbOP2_START = _RTL,
|
||||
|
||||
_FIND, // Laden (+StringID+Typ)
|
||||
_ELEM, // Laden Element (+StringID+Typ)
|
||||
_PARAM, // Parameter (+Offset+Typ)
|
||||
// Verzweigen
|
||||
_CALL, // DECLARE-Methode rufen (+StringID+Typ)
|
||||
_CALLC, // Cdecl-DECLARE-Methode rufen (+StringID+Typ)
|
||||
_CASEIS, // Case-Test (+Test-Opcode+True-Target)
|
||||
// Verwaltung
|
||||
_STMNT, // Beginn eines Statements (+Line+Col)
|
||||
_FIND, // load (+StringID+Typ)
|
||||
_ELEM, // load element (+StringID+Typ)
|
||||
_PARAM, // parameters (+Offset+Typ)
|
||||
// branch
|
||||
_CALL, // call DECLARE-method (+StringID+Typ)
|
||||
_CALLC, // call Cdecl-DECLARE-Method (+StringID+Typ)
|
||||
_CASEIS, // case-test (+Test-Opcode+True-Target)
|
||||
// management
|
||||
_STMNT, // begin of a statement (+Line+Col)
|
||||
// E/A
|
||||
_OPEN, // (+SvStreamFlags+Flags)
|
||||
// Objekte
|
||||
_LOCAL, // Lokale Variable definieren (+StringID+Typ)
|
||||
_PUBLIC, // Modulglobale Variable (+StringID+Typ)
|
||||
_GLOBAL, // Globale Variable definieren, public-Anweisung (+StringID+Typ)
|
||||
_CREATE, // Objekt kreieren (+StringId+StringID)
|
||||
_STATIC, // Statische Variabl (+StringID+Typ) JSM
|
||||
_TCREATE, // User Defined Objekt kreieren
|
||||
_DCREATE, // Objekt-Array kreieren (+StringId+StringID)
|
||||
_GLOBAL_P, // Globale Variable definieren, die beim Neustart von Basic
|
||||
// nicht ueberschrieben wird, P=PERSIST (+StringID+Typ)
|
||||
_FIND_G, // Sucht globale Variable mit Spezialbehandlung wegen _GLOBAL_P
|
||||
_DCREATE_REDIMP, // Objekt-Array redimensionieren (+StringId+StringID)
|
||||
// objects
|
||||
_LOCAL, // define locals variables (+StringID+Typ)
|
||||
_PUBLIC, // module global variables (+StringID+Typ)
|
||||
_GLOBAL, // define global variables, public command (+StringID+Typ)
|
||||
_CREATE, // create object (+StringId+StringID)
|
||||
_STATIC, // static variable (+StringID+Typ) JSM
|
||||
_TCREATE, // create user-defined object
|
||||
_DCREATE, // create object-array (+StringId+StringID)
|
||||
_GLOBAL_P, // define global variable that's not overwritten on restarting
|
||||
// the Basic, P=PERSIST (+StringID+Typ)
|
||||
_FIND_G, // finds global variable with special treatment due to _GLOBAL_P
|
||||
_DCREATE_REDIMP, // redimension object-array (+StringId+StringID)
|
||||
_FIND_CM, // Search inside a class module (CM) to enable global search in time
|
||||
_PUBLIC_P, // Module global Variable (persisted between calls)(+StringID+Typ)
|
||||
_FIND_STATIC, // local static var lookup (+StringID+Typ)
|
||||
|
@ -43,42 +43,42 @@ class SbiParser : public SbiTokenizer
|
||||
{
|
||||
friend class SbiExpression;
|
||||
|
||||
SbiParseStack* pStack; // Block-Stack
|
||||
SbiProcDef* pProc; // aktuelle Prozedur
|
||||
SbiExprNode* pWithVar; // aktuelle With-Variable
|
||||
SbiToken eEndTok; // das Ende-Token
|
||||
sal_uInt32 nGblChain; // Chainkette fuer globale DIMs
|
||||
sal_Bool bGblDefs; // sal_True globale Definitionen allgemein
|
||||
sal_Bool bNewGblDefs; // sal_True globale Definitionen vor Sub
|
||||
sal_Bool bSingleLineIf; // sal_True einzeiliges if-Statement
|
||||
SbiParseStack* pStack;
|
||||
SbiProcDef* pProc;
|
||||
SbiExprNode* pWithVar;
|
||||
SbiToken eEndTok;
|
||||
sal_uInt32 nGblChain; // for global DIMs
|
||||
sal_Bool bGblDefs; // sal_True global definitions general
|
||||
sal_Bool bNewGblDefs; // sal_True globale definitions before sub
|
||||
sal_Bool bSingleLineIf;
|
||||
|
||||
SbiSymDef* VarDecl( SbiDimList**,sal_Bool,sal_Bool );// Variablen-Deklaration
|
||||
SbiProcDef* ProcDecl(sal_Bool bDecl);// Prozedur-Deklaration
|
||||
SbiSymDef* VarDecl( SbiDimList**,sal_Bool,sal_Bool );
|
||||
SbiProcDef* ProcDecl(sal_Bool bDecl);
|
||||
void DefStatic( sal_Bool bPrivate );
|
||||
void DefProc( sal_Bool bStatic, sal_Bool bPrivate ); // Prozedur einlesen
|
||||
void DefVar( SbiOpcode eOp, sal_Bool bStatic ); // DIM/REDIM einlesen
|
||||
void TypeDecl( SbiSymDef&, sal_Bool bAsNewAlreadyParsed=sal_False ); // AS-Deklaration
|
||||
void OpenBlock( SbiToken, SbiExprNode* = NULL ); // Block oeffnen
|
||||
void CloseBlock(); // Block aufloesen
|
||||
sal_Bool Channel( sal_Bool=sal_False ); // Kanalnummer parsen
|
||||
void StmntBlock( SbiToken ); // Statement-Block abarbeiten
|
||||
void DefProc( sal_Bool bStatic, sal_Bool bPrivate ); // read in procedure
|
||||
void DefVar( SbiOpcode eOp, sal_Bool bStatic ); // read in DIM/REDIM
|
||||
void TypeDecl( SbiSymDef&, sal_Bool bAsNewAlreadyParsed=sal_False ); // AS-declaration
|
||||
void OpenBlock( SbiToken, SbiExprNode* = NULL );
|
||||
void CloseBlock();
|
||||
sal_Bool Channel( sal_Bool=sal_False ); // parse channel number
|
||||
void StmntBlock( SbiToken );
|
||||
void DefType( sal_Bool bPrivate ); // Parse type declaration
|
||||
void DefEnum( sal_Bool bPrivate ); // Parse enum declaration
|
||||
void DefDeclare( sal_Bool bPrivate );
|
||||
void EnableCompatibility();
|
||||
public:
|
||||
SbxArrayRef rTypeArray; // das Type-Array
|
||||
SbxArrayRef rEnumArray; // Enum types
|
||||
SbiStringPool aGblStrings; // der String-Pool
|
||||
SbiStringPool aLclStrings; // der String-Pool
|
||||
SbiSymPool aGlobals; // globale Variable
|
||||
SbiSymPool aPublics; // modulglobale Variable
|
||||
SbxArrayRef rTypeArray;
|
||||
SbxArrayRef rEnumArray;
|
||||
SbiStringPool aGblStrings; // string-pool
|
||||
SbiStringPool aLclStrings; // string-pool
|
||||
SbiSymPool aGlobals;
|
||||
SbiSymPool aPublics; // module global
|
||||
SbiSymPool aRtlSyms; // Runtime-Library
|
||||
SbiCodeGen aGen; // Code-Generator
|
||||
StarBASIC* pBasic; // StarBASIC-Instanz
|
||||
SbiSymPool* pPool; // aktueller Pool
|
||||
SbiExprType eCurExpr; // aktueller Expr-Typ
|
||||
short nBase; // OPTION BASE-Wert
|
||||
StarBASIC* pBasic; // StarBASIC instance
|
||||
SbiSymPool* pPool;
|
||||
SbiExprType eCurExpr;
|
||||
short nBase; // OPTION BASE-value
|
||||
sal_Bool bText; // OPTION COMPARE TEXT
|
||||
sal_Bool bExplicit; // sal_True: OPTION EXPLICIT
|
||||
sal_Bool bClassModule; // sal_True: OPTION ClassModule
|
||||
@ -87,28 +87,28 @@ public:
|
||||
SbxDataType eDefTypes[26]; // DEFxxx-Datentypen
|
||||
|
||||
SbiParser( StarBASIC*, SbModule* );
|
||||
sal_Bool Parse(); // die Aktion
|
||||
SbiExprNode* GetWithVar(); // Innerste With-Variable liefern
|
||||
sal_Bool Parse();
|
||||
SbiExprNode* GetWithVar();
|
||||
|
||||
// AB 31.3.1996, Symbol in Runtime-Library suchen
|
||||
// from 31.3.1996, search symbol in the runtime-library
|
||||
SbiSymDef* CheckRTLForSym( const String& rSym, SbxDataType eType );
|
||||
void AddConstants( void );
|
||||
|
||||
sal_Bool HasGlobalCode(); // Globaler Code definiert?
|
||||
sal_Bool HasGlobalCode();
|
||||
|
||||
sal_Bool TestToken( SbiToken ); // bestimmtes TOken?
|
||||
sal_Bool TestSymbol( sal_Bool=sal_False ); // Symbol?
|
||||
sal_Bool TestComma(); // Komma oder EOLN?
|
||||
void TestEoln(); // EOLN?
|
||||
sal_Bool TestToken( SbiToken );
|
||||
sal_Bool TestSymbol( sal_Bool=sal_False );
|
||||
sal_Bool TestComma();
|
||||
void TestEoln();
|
||||
|
||||
void Symbol( const KeywordSymbolInfo* pKeywordSymbolInfo = NULL ); // Let oder Call
|
||||
void Symbol( const KeywordSymbolInfo* pKeywordSymbolInfo = NULL ); // let or call
|
||||
void ErrorStmnt(); // ERROR n
|
||||
void NotImp(); // nicht implementiert
|
||||
void NotImp(); // not implemented
|
||||
void BadBlock(); // LOOP/WEND/NEXT
|
||||
void BadSyntax(); // Falsches SbiToken
|
||||
void NoIf(); // ELSE/ELSE IF ohne IF
|
||||
void BadSyntax(); // wrong SbiToken
|
||||
void NoIf(); // ELSE/ELSE IF without IF
|
||||
void Assign(); // LET
|
||||
void Attribute(); // Attribute
|
||||
void Attribute();
|
||||
void Call(); // CALL
|
||||
void Close(); // CLOSE
|
||||
void Declare(); // DECLARE
|
||||
|
@ -61,16 +61,16 @@ public:
|
||||
|
||||
}
|
||||
|
||||
class SbiInstance; // aktiver StarBASIC-Prozess
|
||||
class SbiRuntime; // aktive StarBASIC-Prozedur-Instanz
|
||||
class SbiInstance; // active StarBASIC process
|
||||
class SbiRuntime; // active StarBASIC procedure instance
|
||||
|
||||
struct SbiArgvStack; // Argv stack element
|
||||
struct SbiGosubStack; // GOSUB stack element
|
||||
class SbiImage; // Code-Image
|
||||
class SbiIoSystem; // Dateisystem
|
||||
class SbiDdeControl; // DDE-Steuerung
|
||||
class SbiDllMgr; // Aufrufe in DLLs
|
||||
class SvNumberFormatter; // Zeit/Datumsfunktionen
|
||||
class SbiIoSystem;
|
||||
class SbiDdeControl;
|
||||
class SbiDllMgr;
|
||||
class SvNumberFormatter; // time/date functions
|
||||
|
||||
enum ForType
|
||||
{
|
||||
@ -113,7 +113,7 @@ struct SbiGosubStack { // GOSUB-Stack:
|
||||
sal_uInt16 nStartForLvl; // #118235: For Level in moment of gosub
|
||||
};
|
||||
|
||||
#define MAXRECURSION 500 // max. 500 Rekursionen
|
||||
#define MAXRECURSION 500
|
||||
|
||||
#define Sb_ATTR_NORMAL 0x0000
|
||||
#define Sb_ATTR_HIDDEN 0x0002
|
||||
@ -143,9 +143,9 @@ public:
|
||||
~SbiRTLData();
|
||||
};
|
||||
|
||||
// Die Instanz entspricht einem laufenden StarBASIC. Mehrere gleichzeitig
|
||||
// laufende BASICs werden ueber verkettete Instanzen verwaltet. Hier liegen
|
||||
// alle Daten, die nur leben, wenn BASIC auch lebt, wie z.B. das I/O-System.
|
||||
// The instance matches a running StarBASIC. Many basics running at the same
|
||||
// time are managed by chained instances. There is all the data that only lives
|
||||
// when the BASIC is living too, like the I/O-system.
|
||||
|
||||
typedef ::std::vector
|
||||
<
|
||||
@ -160,7 +160,7 @@ class SbiInstance
|
||||
|
||||
SbiRTLData aRTLData;
|
||||
|
||||
SbiIoSystem* pIosys; // Dateisystem
|
||||
SbiIoSystem* pIosys; // file system
|
||||
SbiDdeControl* pDdeCtrl; // DDE
|
||||
SbiDllMgr* pDllMgr; // DLL-Calls (DECLARE)
|
||||
StarBASIC* pBasic;
|
||||
@ -169,33 +169,33 @@ class SbiInstance
|
||||
DateFormat meFormatterDateFormat;
|
||||
sal_uInt32 nStdDateIdx, nStdTimeIdx, nStdDateTimeIdx;
|
||||
|
||||
SbError nErr; // aktueller Fehlercode
|
||||
String aErrorMsg; // letzte Error-Message fuer $ARG
|
||||
sal_uInt16 nErl; // aktuelle Fehlerzeile
|
||||
sal_Bool bReschedule; // Flag: sal_True = Reschedule in Hauptschleife
|
||||
SbError nErr;
|
||||
String aErrorMsg; // last error message for $ARG
|
||||
sal_uInt16 nErl; // current error line
|
||||
sal_Bool bReschedule; // Flag: sal_True = Reschedule in main loop
|
||||
sal_Bool bCompatibility; // Flag: sal_True = VBA runtime compatibility mode
|
||||
|
||||
ComponentVector_t ComponentVector;
|
||||
public:
|
||||
SbiRuntime* pRun; // Call-Stack
|
||||
SbiInstance* pNext; // Instanzen-Chain
|
||||
SbiInstance* pNext; // instances chain
|
||||
|
||||
// #31460 Neues Konzept fuer StepInto/Over/Out,
|
||||
// Erklaerung siehe runtime.cxx bei SbiInstance::CalcBreakCallLevel()
|
||||
sal_uInt16 nCallLvl; // Call-Level (wg. Rekursion)
|
||||
sal_uInt16 nBreakCallLvl; // Call-Level zum Anhalten
|
||||
void CalcBreakCallLevel( sal_uInt16 nFlags ); // Gemaess Flags setzen
|
||||
// #31460 new concept for StepInto/Over/Out,
|
||||
// Explaination see runtime.cxx at SbiInstance::CalcBreakCallLevel()
|
||||
sal_uInt16 nCallLvl;
|
||||
sal_uInt16 nBreakCallLvl;
|
||||
void CalcBreakCallLevel( sal_uInt16 nFlags );
|
||||
|
||||
SbiInstance( StarBASIC* );
|
||||
~SbiInstance();
|
||||
|
||||
void Error( SbError ); // trappable Error
|
||||
void Error( SbError, const String& rMsg ); // trappable Error mit Message
|
||||
void Error( SbError, const String& rMsg ); // trappable Error with message
|
||||
void ErrorVB( sal_Int32 nVBNumber, const String& rMsg );
|
||||
void setErrorVB( sal_Int32 nVBNumber, const String& rMsg );
|
||||
void FatalError( SbError ); // non-trappable Error
|
||||
void FatalError( SbError, const String& ); // non-trappable Error
|
||||
void Abort(); // Abbruch mit aktuellem Fehlercode
|
||||
void Abort(); // with current error code
|
||||
|
||||
void Stop();
|
||||
SbError GetErr() { return nErr; }
|
||||
@ -223,16 +223,16 @@ public:
|
||||
sal_uInt32 GetStdTimeIdx() const { return nStdTimeIdx; }
|
||||
sal_uInt32 GetStdDateTimeIdx() const { return nStdDateTimeIdx; }
|
||||
|
||||
// NumberFormatter auch statisch anbieten
|
||||
// offer NumberFormatter also static
|
||||
static void PrepareNumberFormatter( SvNumberFormatter*& rpNumberFormatter,
|
||||
sal_uInt32 &rnStdDateIdx, sal_uInt32 &rnStdTimeIdx, sal_uInt32 &rnStdDateTimeIdx,
|
||||
LanguageType* peFormatterLangType=NULL, DateFormat* peFormatterDateFormat=NULL );
|
||||
};
|
||||
|
||||
SbiIoSystem* SbGetIoSystem(); // das aktuelle I/O-System
|
||||
SbiIoSystem* SbGetIoSystem();
|
||||
|
||||
|
||||
// Verkettbare Items, um Referenzen temporaer zu halten
|
||||
// chainable items to keep references temporary
|
||||
struct RefSaveItem
|
||||
{
|
||||
SbxVariableRef xRef;
|
||||
@ -242,9 +242,8 @@ struct RefSaveItem
|
||||
};
|
||||
|
||||
|
||||
// Eine Instanz dieser Klasse wird fuer jedes ausgefuehrte Unterprogramm
|
||||
// aufgesetzt. Diese Instanz ist das Herz der BASIC-Maschine und enthaelt
|
||||
// nur lokale Daten.
|
||||
// There's one instance of this class for every executed sub-program.
|
||||
// This instance is the heart of the BASIC-machine and contains only local data.
|
||||
|
||||
class SbiRuntime
|
||||
{
|
||||
@ -253,52 +252,52 @@ class SbiRuntime
|
||||
typedef void( SbiRuntime::*pStep0 )();
|
||||
typedef void( SbiRuntime::*pStep1 )( sal_uInt32 nOp1 );
|
||||
typedef void( SbiRuntime::*pStep2 )( sal_uInt32 nOp1, sal_uInt32 nOp2 );
|
||||
static pStep0 aStep0[]; // Opcode-Tabelle Gruppe 0
|
||||
static pStep1 aStep1[]; // Opcode-Tabelle Gruppe 1
|
||||
static pStep2 aStep2[]; // Opcode-Tabelle Gruppe 2
|
||||
static pStep0 aStep0[]; // opcode-table group 0
|
||||
static pStep1 aStep1[];
|
||||
static pStep2 aStep2[];
|
||||
|
||||
StarBASIC& rBasic; // StarBASIC-Instanz
|
||||
SbiInstance* pInst; // aktiver Thread
|
||||
SbModule* pMod; // aktuelles Modul
|
||||
SbMethod* pMeth; // Methoden-Instanz
|
||||
StarBASIC& rBasic; // StarBASIC instance
|
||||
SbiInstance* pInst; // current thread
|
||||
SbModule* pMod; // current module
|
||||
SbMethod* pMeth; // method instance
|
||||
SbiIoSystem* pIosys; // I/O-System
|
||||
const SbiImage* pImg; // Code-Image
|
||||
SbxArrayRef refExprStk; // expression stack
|
||||
SbxArrayRef refCaseStk; // CASE expression stack
|
||||
SbxArrayRef refRedimpArray; // Array saved to use for REDIM PRESERVE
|
||||
SbxVariableRef refRedim; // Array saved to use for REDIM
|
||||
SbxVariableRef xDummyVar; // Ersatz fuer nicht gefundene Variablen
|
||||
SbxVariableRef xDummyVar; // substitute for variables that weren't found
|
||||
SbxVariable* mpExtCaller; // Caller ( external - e.g. button name, shape, range object etc. - only in vba mode )
|
||||
SbiArgvStack* pArgvStk; // ARGV-Stack
|
||||
SbiGosubStack* pGosubStk; // GOSUB stack
|
||||
SbiForStack* pForStk; // FOR/NEXT-Stack
|
||||
sal_uInt16 nExprLvl; // Tiefe des Expr-Stacks
|
||||
sal_uInt16 nGosubLvl; // Zum Vermeiden von Tot-Rekursionen
|
||||
sal_uInt16 nExprLvl; // depth of the expr-stack
|
||||
sal_uInt16 nGosubLvl; // to prevent dead-recursions
|
||||
sal_uInt16 nForLvl; // #118235: Maintain for level
|
||||
const sal_uInt8* pCode; // aktueller Code-Pointer
|
||||
const sal_uInt8* pStmnt; // Beginn des lezten Statements
|
||||
const sal_uInt8* pError; // Adresse des aktuellen Error-Handlers
|
||||
const sal_uInt8* pRestart; // Restart-Adresse
|
||||
const sal_uInt8* pErrCode; // Restart-Adresse RESUME NEXT
|
||||
const sal_uInt8* pCode; // current Code-Pointer
|
||||
const sal_uInt8* pStmnt; // beginning of the last statement
|
||||
const sal_uInt8* pError; // address of the current error handler
|
||||
const sal_uInt8* pRestart; // restart-address
|
||||
const sal_uInt8* pErrCode; // restart-adresse RESUME NEXT
|
||||
const sal_uInt8* pErrStmnt; // Restart-Adresse RESUMT 0
|
||||
String aLibName; // Lib-Name fuer Declare-Call
|
||||
SbxArrayRef refParams; // aktuelle Prozedur-Parameter
|
||||
SbxArrayRef refLocals; // lokale Variable
|
||||
SbxArrayRef refArgv; // aktueller Argv
|
||||
// #74254, Ein refSaveObj reicht nicht! Neu: pRefSaveList (s.u.)
|
||||
short nArgc; // aktueller Argc
|
||||
sal_Bool bRun; // sal_True: Programm ist aktiv
|
||||
sal_Bool bError; // sal_True: Fehler behandeln
|
||||
sal_Bool bInError; // sal_True: in einem Fehler-Handler
|
||||
String aLibName; // Lib-name for declare-call
|
||||
SbxArrayRef refParams; // current procedure parameters
|
||||
SbxArrayRef refLocals; // local variable
|
||||
SbxArrayRef refArgv;
|
||||
// #74254, one refSaveObj is not enough! new: pRefSaveList (see above)
|
||||
short nArgc;
|
||||
sal_Bool bRun;
|
||||
sal_Bool bError; // sal_True: handle errors
|
||||
sal_Bool bInError; // sal_True: in an error handler
|
||||
sal_Bool bBlocked; // sal_True: blocked by next call level, #i48868
|
||||
sal_Bool bVBAEnabled;
|
||||
sal_uInt16 nFlags; // Debugging-Flags
|
||||
SbError nError; // letzter Fehler
|
||||
sal_uInt16 nOps; // Opcode-Zaehler
|
||||
SbError nError;
|
||||
sal_uInt16 nOps; // opcode counter
|
||||
sal_uInt32 m_nLastTime;
|
||||
|
||||
RefSaveItem* pRefSaveList; // #74254 Temporaere Referenzen sichern
|
||||
RefSaveItem* pItemStoreList; // Unbenutzte Items aufbewahren
|
||||
RefSaveItem* pRefSaveList; // #74254 save temporary references
|
||||
RefSaveItem* pItemStoreList; // keep unused items
|
||||
void SaveRef( SbxVariable* pVar )
|
||||
{
|
||||
RefSaveItem* pItem = pItemStoreList;
|
||||
@ -327,43 +326,43 @@ class SbiRuntime
|
||||
void SetupArgs( SbxVariable*, sal_uInt32 );
|
||||
SbxVariable* CheckArray( SbxVariable* );
|
||||
|
||||
void PushVar( SbxVariable* ); // Variable push
|
||||
SbxVariableRef PopVar(); // Variable pop
|
||||
SbxVariable* GetTOS( short=0 ); // Variable vom TOS holen
|
||||
void TOSMakeTemp(); // TOS in temp. Variable wandeln
|
||||
sal_Bool ClearExprStack(); // Expr-Stack freigeben
|
||||
void PushVar( SbxVariable* );
|
||||
SbxVariableRef PopVar();
|
||||
SbxVariable* GetTOS( short=0 );
|
||||
void TOSMakeTemp();
|
||||
sal_Bool ClearExprStack();
|
||||
|
||||
void PushGosub( const sal_uInt8* ); // GOSUB-Element push
|
||||
void PopGosub(); // GOSUB-Element pop
|
||||
void ClearGosubStack(); // GOSUB-Stack freigeben
|
||||
void PushGosub( const sal_uInt8* );
|
||||
void PopGosub();
|
||||
void ClearGosubStack();
|
||||
|
||||
void PushArgv(); // Argv-Element push
|
||||
void PopArgv(); // Argv-Element pop
|
||||
void ClearArgvStack(); // Argv-Stack freigeben
|
||||
void PushArgv();
|
||||
void PopArgv();
|
||||
void ClearArgvStack();
|
||||
|
||||
void PushFor(); // For-Element push
|
||||
void PushForEach(); // For-Each-Element push
|
||||
void PopFor(); // For-Element pop
|
||||
void ClearForStack(); // For-Stack freigeben
|
||||
void PushFor();
|
||||
void PushForEach();
|
||||
void PopFor();
|
||||
void ClearForStack();
|
||||
|
||||
void StepArith( SbxOperator ); // arithmetische Verknuepfungen
|
||||
void StepUnary( SbxOperator ); // unaere Verknuepfungen
|
||||
void StepCompare( SbxOperator );// Vergleiche
|
||||
void StepArith( SbxOperator );
|
||||
void StepUnary( SbxOperator );
|
||||
void StepCompare( SbxOperator );
|
||||
|
||||
void SetParameters( SbxArray* );// Parameter uebernehmen
|
||||
void SetParameters( SbxArray* );
|
||||
|
||||
// MUSS NOCH IMPLEMENTIERT WERDEN
|
||||
// HAS TO BE IMPLEMENTED SOME TIME
|
||||
void DllCall( const String&, const String&, SbxArray*, SbxDataType, sal_Bool );
|
||||
|
||||
// #56204 DIM-Funktionalitaet in Hilfsmethode auslagern (step0.cxx)
|
||||
// #56204 swap out DIM-functionality into help method (step0.cxx)
|
||||
void DimImpl( SbxVariableRef refVar );
|
||||
|
||||
bool implIsClass( SbxObject* pObj, const ::rtl::OUString& aClass );
|
||||
|
||||
void StepSETCLASS_impl( sal_uInt32 nOp1, bool bHandleDflt = false );
|
||||
|
||||
// Die nachfolgenden Routinen werden vom Single Stepper
|
||||
// gerufen und implementieren die einzelnen Opcodes
|
||||
// the following routines are called by the single
|
||||
// stepper and implement the single opcodes
|
||||
void StepNOP(), StepEXP(), StepMUL(), StepDIV();
|
||||
void StepMOD(), StepPLUS(), StepMINUS(), StepNEG();
|
||||
void StepEQ(), StepNE(), StepLT(), StepGT();
|
||||
@ -382,7 +381,7 @@ class SbiRuntime
|
||||
void StepRESTART(), StepEMPTY(), StepLEAVE();
|
||||
void StepLSET(), StepRSET(), StepREDIMP_ERASE(), StepERASE_CLEAR();
|
||||
void StepARRAYACCESS(), StepBYVAL();
|
||||
// Alle Opcodes mit einem Operanden
|
||||
// all opcodes with one operand
|
||||
void StepLOADNC( sal_uInt32 ), StepLOADSC( sal_uInt32 ), StepLOADI( sal_uInt32 );
|
||||
void StepARGN( sal_uInt32 ), StepBASED( sal_uInt32 ), StepPAD( sal_uInt32 );
|
||||
void StepJUMP( sal_uInt32 ), StepJUMPT( sal_uInt32 );
|
||||
@ -392,7 +391,7 @@ class SbiRuntime
|
||||
void StepRESUME( sal_uInt32 ), StepSETCLASS( sal_uInt32 ), StepVBASETCLASS( sal_uInt32 ), StepTESTCLASS( sal_uInt32 ), StepLIB( sal_uInt32 );
|
||||
bool checkClass_Impl( const SbxVariableRef& refVal, const ::rtl::OUString& aClass, bool bRaiseErrors, bool bDefault = true );
|
||||
void StepCLOSE( sal_uInt32 ), StepPRCHAR( sal_uInt32 ), StepARGTYP( sal_uInt32 );
|
||||
// Alle Opcodes mit zwei Operanden
|
||||
// all opcodes with two operands
|
||||
void StepRTL( sal_uInt32, sal_uInt32 ), StepPUBLIC( sal_uInt32, sal_uInt32 ), StepPUBLIC_P( sal_uInt32, sal_uInt32 );
|
||||
void StepPUBLIC_Impl( sal_uInt32, sal_uInt32, bool bUsedForClassModule );
|
||||
void StepFIND_Impl( SbxObject* pObj, sal_uInt32 nOp1, sal_uInt32 nOp2, SbError, sal_Bool bLocal, sal_Bool bStatic = sal_False );
|
||||
@ -413,18 +412,18 @@ public:
|
||||
void SetVBAEnabled( bool bEnabled );
|
||||
sal_uInt16 GetImageFlag( sal_uInt16 n ) const;
|
||||
sal_uInt16 GetBase();
|
||||
xub_StrLen nLine,nCol1,nCol2; // aktuelle Zeile, Spaltenbereich
|
||||
xub_StrLen nLine,nCol1,nCol2;
|
||||
SbiRuntime* pNext; // Stack-Chain
|
||||
|
||||
SbiRuntime( SbModule*, SbMethod*, sal_uInt32 );
|
||||
~SbiRuntime();
|
||||
void Error( SbError, bool bVBATranslationAlreadyDone = false ); // Fehler setzen, falls != 0
|
||||
void Error( SbError, const String& ); // Fehler setzen, falls != 0
|
||||
void FatalError( SbError ); // Fehlerbehandlung=Standard, Fehler setzen
|
||||
void FatalError( SbError, const String& ); // Fehlerbehandlung=Standard, Fehler setzen
|
||||
void Error( SbError, bool bVBATranslationAlreadyDone = false ); // set error if != 0
|
||||
void Error( SbError, const String& ); // set error if != 0
|
||||
void FatalError( SbError ); // error handling = standard, set error
|
||||
void FatalError( SbError, const String& ); // error handling = standard, set error
|
||||
static sal_Int32 translateErrorToVba( SbError nError, String& rMsg );
|
||||
void DumpPCode();
|
||||
sal_Bool Step(); // Einzelschritt (ein Opcode)
|
||||
sal_Bool Step(); // single step (one opcode)
|
||||
void Stop() { bRun = sal_False; }
|
||||
sal_Bool IsRun() { return bRun; }
|
||||
void block( void ) { bBlocked = sal_True; }
|
||||
@ -460,7 +459,7 @@ inline void checkArithmeticOverflow( SbxVariable* pVar )
|
||||
}
|
||||
}
|
||||
|
||||
// Hilfsfunktion, um aktives Basic zu finden
|
||||
|
||||
StarBASIC* GetCurrentBasic( StarBASIC* pRTBasic );
|
||||
|
||||
// Get information if security restrictions should be
|
||||
|
@ -29,12 +29,12 @@
|
||||
#ifndef _SBCOMP_HXX
|
||||
#define _SBCOMP_HXX
|
||||
|
||||
// das folgende habe ich der neuen Datei von MD entnommen! (MT)
|
||||
// I've taken the following from the new file by MD! (MT)
|
||||
#include "sbintern.hxx"
|
||||
#include "token.hxx" // Tokenizer
|
||||
#include "symtbl.hxx" // Symbolverwaltung
|
||||
#include "parser.hxx" // Parser
|
||||
#include "codegen.hxx" // Code-Generator
|
||||
#include "token.hxx"
|
||||
#include "symtbl.hxx"
|
||||
#include "parser.hxx"
|
||||
#include "codegen.hxx"
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -87,7 +87,7 @@ public:
|
||||
SbModule* FindClass( const String& rClassName );
|
||||
};
|
||||
|
||||
// Stack fuer die im Fehlerfall abgebaute SbiRuntime Kette
|
||||
// stack for the SbiRuntime chain which is removed in the case of an error
|
||||
class BASIC_DLLPUBLIC SbErrorStackEntry
|
||||
{
|
||||
public:
|
||||
@ -153,27 +153,27 @@ private:
|
||||
|
||||
struct SbiGlobals
|
||||
{
|
||||
SbiInstance* pInst; // alle aktiven Runtime-Instanzen
|
||||
SbiInstance* pInst; // all active runtime instances
|
||||
SbiFactory* pSbFac; // StarBASIC-Factory
|
||||
SbUnoFactory* pUnoFac; // Factory fuer Uno-Structs bei DIM AS NEW
|
||||
SbUnoFactory* pUnoFac; // Factory for Uno-Structs at DIM AS NEW
|
||||
SbTypeFactory* pTypeFac; // Factory for user defined types
|
||||
SbClassFactory* pClassFac; // Factory for user defined classes (based on class modules)
|
||||
SbOLEFactory* pOLEFac; // Factory for OLE types
|
||||
SbFormFactory* pFormFac; // Factory for user forms
|
||||
SbModule* pMod; // aktuell aktives Modul
|
||||
SbModule* pCompMod; // aktuell compiliertes Modul
|
||||
short nInst; // Anzahl BASICs
|
||||
Link aErrHdl; // globaler Error-Handler
|
||||
Link aBreakHdl; // globaler Break-Handler
|
||||
SbError nCode; // aktueller Fehlercode
|
||||
xub_StrLen nLine; // aktuelle Zeile
|
||||
xub_StrLen nCol1,nCol2; // aktuelle Spalten (von,bis)
|
||||
sal_Bool bCompiler; // Flag fuer Compiler-Error
|
||||
sal_Bool bGlobalInitErr; // Beim GlobalInit trat ein Compiler-Fehler auf
|
||||
sal_Bool bRunInit; // sal_True, wenn RunInit vom Basic aktiv ist
|
||||
String aErrMsg; // Puffer fuer GetErrorText()
|
||||
SbLanguageMode eLanguageMode; // Flag fuer Visual-Basic-Script-Modus
|
||||
SbErrorStack* pErrStack; // Stack fuer die im Fehlerfall abgebaute SbiRuntime Kette
|
||||
SbModule* pMod; // currently active module
|
||||
SbModule* pCompMod; // currently compiled module
|
||||
short nInst; // number of BASICs
|
||||
Link aErrHdl; // global error handler
|
||||
Link aBreakHdl; // global break handler
|
||||
SbError nCode;
|
||||
xub_StrLen nLine;
|
||||
xub_StrLen nCol1,nCol2; // from... to...
|
||||
sal_Bool bCompiler; // flag for compiler error
|
||||
sal_Bool bGlobalInitErr;
|
||||
sal_Bool bRunInit; // sal_True, if RunInit active from the Basic
|
||||
String aErrMsg; // buffer for GetErrorText()
|
||||
SbLanguageMode eLanguageMode; // flag for Visual-Basic-Script-Modus
|
||||
SbErrorStack* pErrStack; // for the SbiRuntime chain
|
||||
::utl::TransliterationWrapper* pTransliterationWrapper; // For StrComp
|
||||
sal_Bool bBlockCompilerError;
|
||||
BasicManager* pAppBasMgr;
|
||||
@ -183,7 +183,7 @@ struct SbiGlobals
|
||||
~SbiGlobals();
|
||||
};
|
||||
|
||||
// Utility-Makros und -Routinen
|
||||
// utility macros and routines
|
||||
|
||||
BASIC_DLLPUBLIC SbiGlobals* GetSbData();
|
||||
|
||||
|
@ -32,9 +32,9 @@
|
||||
|
||||
#include <basic/sbmeth.hxx>
|
||||
|
||||
// Basic-Modul fuer JavaScript-Sourcen.
|
||||
// Alle Basic-spezifischen Methoden muessen virtuell ueberladen und deaktiviert
|
||||
// werden. Die Unterscheidung von normalen Modulen erfolgt uebr RTTI.
|
||||
// basic module for JavaScript sources
|
||||
// All the basic-specific methods must be overloaded virtually and must
|
||||
// be deactivated. The differentiation of normal modules is done by RTTI.
|
||||
|
||||
class SbJScriptMethod : public SbMethod
|
||||
{
|
||||
|
@ -31,9 +31,9 @@
|
||||
|
||||
#include <basic/sbmod.hxx>
|
||||
|
||||
// Basic-Modul fuer JavaScript-Sourcen.
|
||||
// Alle Basic-spezifischen Methoden muessen virtuell ueberladen und deaktiviert
|
||||
// werden. Die Unterscheidung von normalen Modulen erfolgt uebr RTTI.
|
||||
// basic module for JavaScript sources
|
||||
// All the basic-specific methods must be overloaded virtually and must
|
||||
// be deactivated. The differentiation of normal modules is done by RTTI.
|
||||
|
||||
class SbJScriptModule : public SbModule
|
||||
{
|
||||
@ -42,7 +42,7 @@ class SbJScriptModule : public SbModule
|
||||
public:
|
||||
SBX_DECL_PERSIST_NODATA(SBXCR_SBX,SBXID_JSCRIPTMOD,1);
|
||||
TYPEINFO();
|
||||
SbJScriptModule( const String& ); // DURCHREICHEN
|
||||
SbJScriptModule( const String& ); // hand through
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -56,11 +56,11 @@ class SbUnoObject: public SbxObject
|
||||
sal_Bool bNativeCOMObject;
|
||||
::com::sun::star::uno::Any maTmpUnoObj; // Only to save obj for doIntrospection!
|
||||
|
||||
// Hilfs-Methode zum Anlegen der dbg_-Properties
|
||||
// help method to establish the dbg_-properties
|
||||
void implCreateDbgProperties( void );
|
||||
|
||||
// Hilfs-Methode zum Anlegen aller Properties und Methoden
|
||||
// (Beim on-demand-Mechanismus erforderlich fuer die dbg_-Properties)
|
||||
// help method to establish all properties and methods
|
||||
// (on the on-demand-mechanism required for the dbg_-properties)
|
||||
void implCreateAll( void );
|
||||
|
||||
public:
|
||||
@ -69,17 +69,17 @@ public:
|
||||
SbUnoObject( const ::rtl::OUString& aName_, const ::com::sun::star::uno::Any& aUnoObj_ );
|
||||
~SbUnoObject();
|
||||
|
||||
// #76470 Introspection on Demand durchfuehren
|
||||
// #76470 do introspection on demand
|
||||
void doIntrospection( void );
|
||||
|
||||
// Find ueberladen, um z.B. NameAccess zu unterstuetzen
|
||||
// Find overloaded to support e. g. NameAccess
|
||||
virtual SbxVariable* Find( const String&, SbxClassType );
|
||||
|
||||
// Force creation of all properties for debugging
|
||||
void createAllProperties( void )
|
||||
{ implCreateAll(); }
|
||||
|
||||
// Wert rausgeben
|
||||
// give out value
|
||||
::com::sun::star::uno::Any getUnoAny( void );
|
||||
::com::sun::star::uno::Reference< ::com::sun::star::beans::XIntrospectionAccess > getIntrospectionAccess( void ) { return mxUnoAccess; }
|
||||
::com::sun::star::uno::Reference< ::com::sun::star::script::XInvocation > getInvocation( void ) { return mxInvocation; }
|
||||
@ -92,7 +92,7 @@ public:
|
||||
SV_DECL_IMPL_REF(SbUnoObject);
|
||||
|
||||
|
||||
// #67781 Rueckgabewerte der Uno-Methoden loeschen
|
||||
// #67781 delete return values of the uno-methods
|
||||
void clearUnoMethods( void );
|
||||
void clearUnoMethodsForBasic( StarBASIC* pBasic );
|
||||
|
||||
@ -105,7 +105,7 @@ class SbUnoMethod : public SbxMethod
|
||||
::com::sun::star::uno::Reference< ::com::sun::star::reflection::XIdlMethod > m_xUnoMethod;
|
||||
::com::sun::star::uno::Sequence< ::com::sun::star::reflection::ParamInfo >* pParamInfoSeq;
|
||||
|
||||
// #67781 Verweis auf vorige und naechste Methode in der Methoden-Liste
|
||||
// #67781 reference to the previous and the next method in the method list
|
||||
SbUnoMethod* pPrev;
|
||||
SbUnoMethod* pNext;
|
||||
|
||||
@ -134,7 +134,6 @@ class SbUnoProperty : public SbxProperty
|
||||
{
|
||||
friend class SbUnoObject;
|
||||
|
||||
// Daten der Uno-Property
|
||||
::com::sun::star::beans::Property aUnoProp;
|
||||
sal_Int32 nId;
|
||||
|
||||
@ -150,7 +149,7 @@ public:
|
||||
{ return mbInvocation; }
|
||||
};
|
||||
|
||||
// Factory-Klasse fuer das Anlegen von Uno-Structs per DIM AS NEW
|
||||
// factory class to create uno-structs per DIM AS NEW
|
||||
class SbUnoFactory : public SbxFactory
|
||||
{
|
||||
public:
|
||||
@ -158,7 +157,7 @@ public:
|
||||
virtual SbxObject* CreateObject( const String& );
|
||||
};
|
||||
|
||||
// Wrapper fuer eine Uno-Klasse
|
||||
// wrapper for an uno-class
|
||||
class SbUnoClass : public SbxObject
|
||||
{
|
||||
const ::com::sun::star::uno::Reference< ::com::sun::star::reflection::XIdlClass > m_xClass;
|
||||
@ -173,18 +172,18 @@ public:
|
||||
, m_xClass( xClass_ )
|
||||
{}
|
||||
|
||||
// Find ueberladen, um Elemente on Demand anzulegen
|
||||
|
||||
virtual SbxVariable* Find( const String&, SbxClassType );
|
||||
|
||||
// Wert rausgeben
|
||||
|
||||
const ::com::sun::star::uno::Reference< ::com::sun::star::reflection::XIdlClass >& getUnoClass( void ) { return m_xClass; }
|
||||
|
||||
};
|
||||
SV_DECL_IMPL_REF(SbUnoClass);
|
||||
|
||||
|
||||
// Funktion, um einen globalen Bezeichner im
|
||||
// UnoScope zu suchen und fuer Sbx zu wrappen
|
||||
// function to find a global identifier in
|
||||
// the UnoScope and to wrap it for Sbx
|
||||
SbUnoClass* findUnoClass( const ::rtl::OUString& rName );
|
||||
|
||||
|
||||
@ -290,7 +289,7 @@ public:
|
||||
|
||||
class StarBASIC;
|
||||
|
||||
// Impl-Methoden fuer RTL
|
||||
// Impl-methods for RTL
|
||||
void RTL_Impl_CreateUnoStruct( StarBASIC* pBasic, SbxArray& rPar, sal_Bool bWrite );
|
||||
void RTL_Impl_CreateUnoService( StarBASIC* pBasic, SbxArray& rPar, sal_Bool bWrite );
|
||||
void RTL_Impl_CreateUnoServiceWithArguments( StarBASIC* pBasic, SbxArray& rPar, sal_Bool bWrite );
|
||||
|
@ -32,43 +32,42 @@
|
||||
#include <tools/string.hxx>
|
||||
#include <basic/sberrors.hxx>
|
||||
|
||||
// Der Scanner ist stand-alone, d.h. er kann von ueberallher verwendet
|
||||
// werden. Eine BASIC-Instanz ist fuer Fehlermeldungen notwendig. Ohne
|
||||
// BASIC werden die Fehler nur gezaehlt. Auch ist Basic notwendig, wenn
|
||||
// eine erweiterte SBX-Variable zur Erkennung von Datentypen etc. verwendet
|
||||
// werden soll.
|
||||
// The scanner is stand-alone, i. e. it can be used from everywhere.
|
||||
// A BASIC-instance is necessary for error messages. Without BASIC
|
||||
// the errors are only counted. Also the BASICC is necessary when an
|
||||
// advanced SBX-variable shall be used for data type recognition etc.
|
||||
|
||||
class StarBASIC;
|
||||
|
||||
class SbiScanner
|
||||
{
|
||||
::rtl::OUString aBuf; // Input-Puffer
|
||||
::rtl::OUString aLine; // aktuelle Zeile
|
||||
const sal_Unicode* pLine; // Pointer
|
||||
const sal_Unicode* pSaveLine; // Merker fuer Line
|
||||
::rtl::OUString aBuf; // input buffer
|
||||
::rtl::OUString aLine;
|
||||
const sal_Unicode* pLine;
|
||||
const sal_Unicode* pSaveLine;
|
||||
protected:
|
||||
String aSym; // Symbolpuffer
|
||||
String aError; // Fehler-String
|
||||
SbxDataType eScanType; // evtl. Datentyp
|
||||
StarBASIC* pBasic; // Instanz fuer Fehler-Callbacks
|
||||
double nVal; // numerischer Wert
|
||||
short nCurCol1; // aktuelle Spalte 1
|
||||
short nSavedCol1; // gerettete Spalte 1
|
||||
short nCol; // aktuelle Spaltennummer
|
||||
short nErrors; // Anzahl Fehler
|
||||
short nColLock; // Lock-Zaehler fuer Col1
|
||||
sal_Int32 nBufPos; // aktuelle Buffer-Pos
|
||||
sal_uInt16 nLine; // aktuelle Zeile
|
||||
sal_uInt16 nCol1, nCol2; // aktuelle 1. und 2. Spalte
|
||||
sal_Bool bSymbol; // sal_True: Symbol gescannt
|
||||
sal_Bool bNumber; // sal_True: Zahl gescannt
|
||||
sal_Bool bSpaces; // sal_True: Whitespace vor Token
|
||||
sal_Bool bErrors; // sal_True: Fehler generieren
|
||||
sal_Bool bAbort; // sal_True: abbrechen
|
||||
sal_Bool bHash; // sal_True: # eingelesen
|
||||
sal_Bool bError; // sal_True: Fehler generieren
|
||||
sal_Bool bUsedForHilite; // sal_True: Nutzung fuer Highlighting
|
||||
sal_Bool bCompatible; // sal_True: OPTION Compatibl
|
||||
String aSym;
|
||||
String aError;
|
||||
SbxDataType eScanType;
|
||||
StarBASIC* pBasic; // instance for error callbacks
|
||||
double nVal; // numeric value
|
||||
short nCurCol1;
|
||||
short nSavedCol1;
|
||||
short nCol;
|
||||
short nErrors;
|
||||
short nColLock; // lock counter for Col1
|
||||
sal_Int32 nBufPos;
|
||||
sal_uInt16 nLine;
|
||||
sal_uInt16 nCol1, nCol2;
|
||||
sal_Bool bSymbol; // sal_True: symbol scanned
|
||||
sal_Bool bNumber; // sal_True: number scanned
|
||||
sal_Bool bSpaces; // sal_True: whitespace before token
|
||||
sal_Bool bErrors; // sal_True: generate errors
|
||||
sal_Bool bAbort;
|
||||
sal_Bool bHash; // sal_True: # has been read in
|
||||
sal_Bool bError; // sal_True: generate error
|
||||
sal_Bool bUsedForHilite;
|
||||
sal_Bool bCompatible; // sal_True: OPTION compatible
|
||||
sal_Bool bVBASupportOn; // sal_True: OPTION VBASupport 1 otherwise default False
|
||||
sal_Bool bPrevLineExtentsComment; // sal_True: Previous line is comment and ends on "... _"
|
||||
|
||||
@ -96,7 +95,7 @@ public:
|
||||
void UnlockColumn();
|
||||
sal_Bool DoesColonFollow();
|
||||
|
||||
sal_Bool NextSym(); // naechstes Symbol lesen
|
||||
sal_Bool NextSym();
|
||||
const String& GetSym() { return aSym; }
|
||||
SbxDataType GetType() { return eScanType; }
|
||||
double GetDbl() { return nVal; }
|
||||
|
@ -34,11 +34,11 @@
|
||||
#include <basic/sbxdef.hxx>
|
||||
#include <basic/sbdef.hxx>
|
||||
|
||||
class SbiSymDef; // Basisklasse
|
||||
class SbiProcDef; // Prozedur
|
||||
class SbiConstDef; // Konstante
|
||||
class SbiSymPool; // Symbol-Pool
|
||||
class SbiStringPool; // gepoolte Strings
|
||||
class SbiSymDef; // base class
|
||||
class SbiProcDef;
|
||||
class SbiConstDef;
|
||||
class SbiSymPool;
|
||||
class SbiStringPool;
|
||||
|
||||
class SvStream;
|
||||
class SbiParser;
|
||||
@ -46,21 +46,21 @@ class SbiParser;
|
||||
enum SbiSymScope { SbLOCAL, SbPARAM, SbPUBLIC, SbGLOBAL, SbRTL };
|
||||
|
||||
|
||||
// Der String-Pool nimmt String-Eintraege auf und sorgt dafuer,
|
||||
// dass sie nicht doppelt vorkommen.
|
||||
// The string-pool collects string entries and
|
||||
// makes sure that they don't exist twice.
|
||||
|
||||
SV_DECL_PTRARR_DEL(SbiStrings,String*,5,5)
|
||||
|
||||
class SbiStringPool { // String-Pool
|
||||
SbiStrings aData; // Daten
|
||||
class SbiStringPool {
|
||||
SbiStrings aData;
|
||||
String aEmpty; // for convenience
|
||||
SbiParser* pParser; // der Parser
|
||||
SbiParser* pParser;
|
||||
public:
|
||||
SbiStringPool( SbiParser* );
|
||||
~SbiStringPool();
|
||||
sal_uInt16 GetSize() const { return aData.Count(); }
|
||||
// AB 8.4.1999, Default wegen #64236 auf sal_True geaendert
|
||||
// Wenn der Bug sauber behoben ist, wieder auf sal_False aendern.
|
||||
// From 8.4.1999: default changed to sal_True because of #64236 -
|
||||
// change it back to sal_False when the bug is cleanly removed.
|
||||
short Add( const String&, sal_Bool=sal_True );
|
||||
short Add( double, SbxDataType );
|
||||
const String& Find( sal_uInt16 ) const;
|
||||
@ -70,17 +70,17 @@ public:
|
||||
|
||||
SV_DECL_PTRARR_DEL(SbiSymbols,SbiSymDef*,5,5)
|
||||
|
||||
class SbiSymPool { // Symbol-Pool
|
||||
class SbiSymPool {
|
||||
friend class SbiSymDef;
|
||||
friend class SbiProcDef;
|
||||
protected:
|
||||
SbiStringPool& rStrings; // verwendeter Stringpool
|
||||
SbiSymbols aData; // Daten
|
||||
SbiSymPool* pParent; // uebergeordneter Symbol-Pool
|
||||
SbiParser* pParser; // der Parser
|
||||
SbiSymScope eScope; // Scope des Pools
|
||||
sal_uInt16 nProcId; // aktuelles ProcId fuer STATIC-Variable
|
||||
sal_uInt16 nCur; // Iterator
|
||||
SbiStringPool& rStrings;
|
||||
SbiSymbols aData;
|
||||
SbiSymPool* pParent;
|
||||
SbiParser* pParser;
|
||||
SbiSymScope eScope;
|
||||
sal_uInt16 nProcId; // for STATIC-variable
|
||||
sal_uInt16 nCur; // iterator
|
||||
public:
|
||||
SbiSymPool( SbiStringPool&, SbiSymScope );
|
||||
~SbiSymPool();
|
||||
@ -94,41 +94,41 @@ public:
|
||||
void SetScope( SbiSymScope s ) { eScope = s; }
|
||||
SbiParser* GetParser() { return pParser; }
|
||||
|
||||
SbiSymDef* AddSym( const String& ); // Symbol hinzufuegen
|
||||
SbiProcDef* AddProc( const String& );// Prozedur hinzufuegen
|
||||
void Add( SbiSymDef* ); // Symbol uebernehmen
|
||||
SbiSymDef* Find( const String& ) const;// Variablenname
|
||||
SbiSymDef* FindId( sal_uInt16 ) const; // Variable per ID suchen
|
||||
SbiSymDef* Get( sal_uInt16 ) const; // Variable per Position suchen
|
||||
SbiSymDef* First(), *Next(); // Iteratoren
|
||||
SbiSymDef* AddSym( const String& );
|
||||
SbiProcDef* AddProc( const String& );
|
||||
void Add( SbiSymDef* );
|
||||
SbiSymDef* Find( const String& ) const; // variable name
|
||||
SbiSymDef* FindId( sal_uInt16 ) const;
|
||||
SbiSymDef* Get( sal_uInt16 ) const; // find variable per position
|
||||
SbiSymDef* First(), *Next(); // iterators
|
||||
|
||||
sal_uInt32 Define( const String& ); // Label definieren
|
||||
sal_uInt32 Reference( const String& ); // Label referenzieren
|
||||
void CheckRefs(); // offene Referenzen suchen
|
||||
sal_uInt32 Define( const String& );
|
||||
sal_uInt32 Reference( const String& );
|
||||
void CheckRefs();
|
||||
};
|
||||
|
||||
|
||||
class SbiSymDef { // Allgemeiner Symboleintrag
|
||||
class SbiSymDef { // general symbol entry
|
||||
friend class SbiSymPool;
|
||||
protected:
|
||||
String aName; // Name des Eintrags
|
||||
SbxDataType eType; // Typ des Eintrags
|
||||
SbiSymPool* pIn; // Parent-Pool
|
||||
SbiSymPool* pPool; // Pool fuer Unterelemente
|
||||
short nLen; // Stringlaenge bei STRING*n
|
||||
short nDims; // Array-Dimensionen
|
||||
sal_uInt16 nId; // Symbol-Nummer
|
||||
sal_uInt16 nTypeId; // String-ID des Datentyps (Dim X AS Dytentyp)
|
||||
sal_uInt16 nProcId; // aktuelles ProcId fuer STATIC-Variable
|
||||
sal_uInt16 nPos; // Positions-Nummer
|
||||
sal_uInt32 nChain; // Backchain-Kette
|
||||
String aName;
|
||||
SbxDataType eType;
|
||||
SbiSymPool* pIn; // parent pool
|
||||
SbiSymPool* pPool; // pool for sub-elements
|
||||
short nLen; // string length for STRING*n
|
||||
short nDims;
|
||||
sal_uInt16 nId;
|
||||
sal_uInt16 nTypeId; // Dim X AS data type
|
||||
sal_uInt16 nProcId;
|
||||
sal_uInt16 nPos;
|
||||
sal_uInt32 nChain;
|
||||
sal_Bool bNew : 1; // sal_True: Dim As New...
|
||||
sal_Bool bChained : 1; // sal_True: Symbol ist in Code definiert
|
||||
sal_Bool bByVal : 1; // sal_True: ByVal-Parameter
|
||||
sal_Bool bOpt : 1; // sal_True: optionaler Parameter
|
||||
sal_Bool bStatic : 1; // sal_True: STATIC-Variable
|
||||
sal_Bool bAs : 1; // sal_True: Datentyp per AS XXX definiert
|
||||
sal_Bool bGlobal : 1; // sal_True: Global-Variable
|
||||
sal_Bool bChained : 1; // sal_True: symbol is defined in code
|
||||
sal_Bool bByVal : 1; // sal_True: ByVal-parameter
|
||||
sal_Bool bOpt : 1; // sal_True: optional parameter
|
||||
sal_Bool bStatic : 1; // sal_True: STATIC variable
|
||||
sal_Bool bAs : 1; // sal_True: data type defined per AS XXX
|
||||
sal_Bool bGlobal : 1; // sal_True: global variable
|
||||
sal_Bool bParamArray : 1; // sal_True: ParamArray parameter
|
||||
sal_Bool bWithEvents : 1; // sal_True: Declared WithEvents
|
||||
sal_Bool bWithBrackets : 1; // sal_True: Followed by ()
|
||||
@ -180,24 +180,24 @@ public:
|
||||
void SetFixedStringLength( short n ) { nFixedStringLength = n; }
|
||||
|
||||
SbiSymPool& GetPool();
|
||||
sal_uInt32 Define(); // Symbol in Code definieren
|
||||
sal_uInt32 Reference(); // Symbol in Code referenzieren
|
||||
sal_uInt32 Define(); // define symbol in code
|
||||
sal_uInt32 Reference(); // reference symbol in code
|
||||
|
||||
private:
|
||||
SbiSymDef( const SbiSymDef& );
|
||||
|
||||
};
|
||||
|
||||
class SbiProcDef : public SbiSymDef { // Prozedur-Definition (aus Basic):
|
||||
SbiSymPool aParams; // Parameter
|
||||
SbiSymPool aLabels; // lokale Sprungziele
|
||||
String aLibName; // LIB "name"
|
||||
String aAlias; // ALIAS "name"
|
||||
sal_uInt16 nLine1, nLine2; // Zeilenbereich
|
||||
class SbiProcDef : public SbiSymDef { // procedure definition (from basic):
|
||||
SbiSymPool aParams;
|
||||
SbiSymPool aLabels; // local jump targets
|
||||
String aLibName;
|
||||
String aAlias;
|
||||
sal_uInt16 nLine1, nLine2; // line area
|
||||
PropertyMode mePropMode; // Marks if this is a property procedure and which
|
||||
String maPropName; // Property name if property procedure (!= proc name)
|
||||
sal_Bool bCdecl : 1; // sal_True: CDECL angegeben
|
||||
sal_Bool bPublic : 1; // sal_True: proc ist PUBLIC
|
||||
sal_Bool bCdecl : 1; // sal_True: CDECL given
|
||||
sal_Bool bPublic : 1; // sal_True: proc is PUBLIC
|
||||
sal_Bool mbProcDecl : 1; // sal_True: instanciated by SbiParser::ProcDecl
|
||||
public:
|
||||
SbiProcDef( SbiParser*, const String&, sal_Bool bProcDecl=false );
|
||||
@ -222,9 +222,8 @@ public:
|
||||
void setPropertyMode( PropertyMode ePropMode );
|
||||
const String& GetPropName() { return maPropName; }
|
||||
|
||||
// Match mit einer Forward-Deklaration. Die Parameternamen
|
||||
// werden abgeglichen und die Forward-Deklaration wird
|
||||
// durch this ersetzt
|
||||
// Match with a forward-declaration. The parameter names are
|
||||
// compared and the forward declaration is replaced by this
|
||||
void Match( SbiProcDef* pForward );
|
||||
|
||||
private:
|
||||
|
@ -37,28 +37,28 @@
|
||||
#undef SHARED
|
||||
#endif
|
||||
|
||||
// Der Tokenizer ist stand-alone, d.h. er kann von ueberallher verwendet
|
||||
// werden. Eine BASIC-Instanz ist fuer Fehlermeldungen notwendig. Ohne
|
||||
// BASIC werden die Fehler nur gezaehlt. Auch ist Basic notwendig, wenn
|
||||
// eine erweiterte SBX-Variable zur Erkennung von Datentypen etc. verwendet
|
||||
// werden soll.
|
||||
// The tokenizer is stand-alone, i. e. he can be used from everywhere.
|
||||
// A BASIC-instance is necessary for error messages. Without BASIC the
|
||||
// errors are only counted. The BASIC is also necessary when an advanced
|
||||
// SBX-variable shall be used for recognition of data types etc.
|
||||
|
||||
|
||||
enum SbiToken {
|
||||
NIL = 0,
|
||||
// Token zwischen 0x20 und 0x3F sind Literale:
|
||||
// tokens between 0x20 and 0x3F are literals:
|
||||
LPAREN = '(', RPAREN = ')', COMMA = ',', DOT = '.', EXCLAM = '!',
|
||||
HASH = '#', SEMICOLON = ';',
|
||||
|
||||
// Anweisungen:
|
||||
// commands:
|
||||
FIRSTKWD = 0x40,
|
||||
AS = FIRSTKWD, ALIAS, ASSIGN,
|
||||
CALL, CASE, CLOSE, COMPARE, _CONST_,
|
||||
DECLARE, DIM, DO,
|
||||
|
||||
// in der Reihenfolge der Datentyp-Enums!
|
||||
// in the order of the data type enums!
|
||||
DEFINT, DEFLNG, DEFSNG, DEFDBL, DEFCUR, DEFDATE, DEFSTR, DEFOBJ,
|
||||
DEFERR, DEFBOOL, DEFVAR,
|
||||
// in der Reihenfolge der Datentyp-Enums!
|
||||
// in the order of the data type enums!
|
||||
DATATYPE1,
|
||||
TINTEGER = DATATYPE1,
|
||||
TLONG, TSINGLE, TDOUBLE, TCURRENCY, TDATE, TSTRING, TOBJECT,
|
||||
@ -79,29 +79,29 @@ enum SbiToken {
|
||||
UNTIL,
|
||||
WEND, WHILE, WITH, WRITE,
|
||||
ENDENUM, ENDIF, ENDFUNC, ENDPROPERTY, ENDSUB, ENDTYPE, ENDSELECT, ENDWITH,
|
||||
// Ende aller Keywords
|
||||
// end of all keywords
|
||||
LASTKWD = ENDWITH,
|
||||
// Statement-Ende
|
||||
// statement end
|
||||
EOS, EOLN,
|
||||
// Operatoren:
|
||||
// operators:
|
||||
EXPON, NEG, MUL,
|
||||
DIV, IDIV, MOD, PLUS, MINUS,
|
||||
EQ, NE, LT, GT, LE, GE,
|
||||
NOT, AND, OR, XOR, EQV,
|
||||
IMP, CAT, LIKE, IS, TYPEOF,
|
||||
// Sonstiges:
|
||||
// miscellaneous:
|
||||
FIRSTEXTRA,
|
||||
NUMBER=FIRSTEXTRA, FIXSTRING, SYMBOL, _CDECL_, BYVAL, BYREF,
|
||||
OUTPUT, RANDOM, APPEND, BINARY, ACCESS,
|
||||
LOCK, READ, PRESERVE, BASE, ANY, LIB, _OPTIONAL_,
|
||||
EXPLICIT, COMPATIBLE, CLASSMODULE, PARAMARRAY, WITHEVENTS,
|
||||
|
||||
// Ab hier kommen JavaScript-Tokens (gleiches enum, damit gleicher Typ)
|
||||
// from here there are JavaScript-tokens (same enum so that same type)
|
||||
FIRSTJAVA,
|
||||
JS_BREAK=FIRSTJAVA, JS_CONTINUE, JS_FOR, JS_FUNCTION, JS_IF, JS_NEW,
|
||||
JS_RETURN, JS_THIS, JS_VAR, JS_WHILE, JS_WITH,
|
||||
|
||||
// JavaScript-Operatoren
|
||||
// JavaScript-operators
|
||||
// _ASS_ = Assignment
|
||||
JS_COMMA, JS_ASSIGNMENT, JS_ASS_PLUS, JS_ASS_MINUS, JS_ASS_MUL,
|
||||
JS_ASS_DIV, JS_ASS_MOD, JS_ASS_LSHIFT, JS_ASS_RSHIFT, JS_ASS_RSHIFT_Z,
|
||||
@ -139,13 +139,13 @@ class SbiTokenizer : public SbiScanner {
|
||||
TokenLabelInfo m_aTokenLabelInfo;
|
||||
|
||||
protected:
|
||||
SbiToken eCurTok; // aktuelles Token
|
||||
SbiToken ePush; // Pushback-Token
|
||||
sal_uInt16 nPLine, nPCol1, nPCol2; // Pushback-Location
|
||||
sal_Bool bEof; // sal_True bei Dateiende
|
||||
sal_Bool bEos; // sal_True bei Statement-Ende
|
||||
sal_Bool bKeywords; // sal_True, falls Keywords geparst werden
|
||||
sal_Bool bAs; // letztes Keyword war AS
|
||||
SbiToken eCurTok;
|
||||
SbiToken ePush;
|
||||
sal_uInt16 nPLine, nPCol1, nPCol2; // pushback location
|
||||
sal_Bool bEof;
|
||||
sal_Bool bEos;
|
||||
sal_Bool bKeywords; // sal_True, if keywords are parsed
|
||||
sal_Bool bAs; // last keyword was AS
|
||||
sal_Bool bErrorIsSymbol; // Handle Error token as Symbol, not keyword
|
||||
public:
|
||||
SbiTokenizer( const ::rtl::OUString&, StarBASIC* = NULL );
|
||||
@ -154,14 +154,14 @@ public:
|
||||
inline sal_Bool IsEof() { return bEof; }
|
||||
inline sal_Bool IsEos() { return bEos; }
|
||||
|
||||
void Push( SbiToken ); // Pushback eines Tokens
|
||||
const String& Symbol( SbiToken );// Rueckumwandlung
|
||||
void Push( SbiToken );
|
||||
const String& Symbol( SbiToken ); // reconversion
|
||||
|
||||
SbiToken Peek(); // das naechste Token lesen
|
||||
SbiToken Next(); // Ein Token lesen
|
||||
sal_Bool MayBeLabel( sal_Bool= sal_False ); // Kann es ein Label sein?
|
||||
SbiToken Peek(); // read the next token
|
||||
SbiToken Next(); // read a token
|
||||
sal_Bool MayBeLabel( sal_Bool= sal_False );
|
||||
|
||||
void Hilite( SbTextPortions& ); // Syntax-Highlighting
|
||||
void Hilite( SbTextPortions& );
|
||||
|
||||
void Error( SbError c ) { GenError( c ); }
|
||||
void Error( SbError, SbiToken );
|
||||
|
@ -79,8 +79,8 @@ void BasicDLL::SetDebugMode( sal_Bool bDebugMode )
|
||||
|
||||
void BasicDLL::BasicBreak()
|
||||
{
|
||||
//bJustStopping: Wenn jemand wie wild x-mal STOP drueckt, aber das Basic
|
||||
// nicht schnell genug anhaelt, kommt die Box ggf. oefters...
|
||||
// bJustStopping: if there's someone pressing STOP like crazy umpteen times,
|
||||
// but the Basic doesn't stop early enough, the box might appear more often...
|
||||
static sal_Bool bJustStopping = sal_False;
|
||||
|
||||
BasicDLL* pThis = *(BasicDLL**)GetAppData(SHL_BASIC);
|
||||
|
@ -167,7 +167,7 @@ RTLFUNC(InputBox)
|
||||
{
|
||||
String aTitle;
|
||||
String aDefault;
|
||||
sal_Int32 nX = -1, nY = -1; // zentrieren
|
||||
sal_Int32 nX = -1, nY = -1; // center
|
||||
const String& rPrompt = rPar.Get(1)->GetString();
|
||||
if ( nArgCount > 2 && !rPar.Get(2)->IsErr() )
|
||||
aTitle = rPar.Get(2)->GetString();
|
||||
|
@ -73,7 +73,7 @@ using namespace com::sun::star::bridge;
|
||||
#include "iosys.hxx"
|
||||
#include "sbintern.hxx"
|
||||
|
||||
// Der Input-Dialog:
|
||||
|
||||
|
||||
class SbiInputDialog : public ModalDialog {
|
||||
Edit aInput;
|
||||
@ -145,7 +145,7 @@ SbiStream::~SbiStream()
|
||||
delete pStrm;
|
||||
}
|
||||
|
||||
// Ummappen eines SvStream-Fehlers auf einen StarBASIC-Code
|
||||
// map an SvStream-error to StarBASIC-code
|
||||
|
||||
void SbiStream::MapError()
|
||||
{
|
||||
@ -560,7 +560,7 @@ void UCBStream::SetSize( sal_uIntPtr nSize )
|
||||
SetError( ERRCODE_IO_GENERAL );
|
||||
}
|
||||
|
||||
// Oeffnen eines Streams
|
||||
|
||||
SbError SbiStream::Open
|
||||
( short nCh, const ByteString& rName, short nStrmMode, short nFlags, short nL )
|
||||
{
|
||||
@ -706,8 +706,8 @@ SbError SbiStream::Write( const ByteString& rBuf, sal_uInt16 n )
|
||||
if( IsText() )
|
||||
{
|
||||
aLine += rBuf;
|
||||
// Raus damit, wenn das Ende ein LF ist, aber CRLF vorher
|
||||
// strippen, da der SvStrm ein CRLF anfuegt!
|
||||
// Get it out, if the end is an LF, but strip CRLF before,
|
||||
// because the SvStrm adds a CRLF!
|
||||
sal_uInt16 nLineLen = aLine.Len();
|
||||
if( nLineLen && aLine.GetBuffer()[ --nLineLen ] == 0x0A )
|
||||
{
|
||||
@ -730,7 +730,6 @@ SbError SbiStream::Write( const ByteString& rBuf, sal_uInt16 n )
|
||||
}
|
||||
|
||||
|
||||
// Zugriff auf das aktuelle I/O-System:
|
||||
|
||||
SbiIoSystem* SbGetIoSystem()
|
||||
{
|
||||
@ -776,7 +775,6 @@ void SbiIoSystem::Open
|
||||
nChan = 0;
|
||||
}
|
||||
|
||||
// Aktuellen Kanal schliessen
|
||||
|
||||
void SbiIoSystem::Close()
|
||||
{
|
||||
@ -793,7 +791,6 @@ void SbiIoSystem::Close()
|
||||
nChan = 0;
|
||||
}
|
||||
|
||||
// Shutdown nach Programmlauf
|
||||
|
||||
void SbiIoSystem::Shutdown()
|
||||
{
|
||||
@ -809,7 +806,7 @@ void SbiIoSystem::Shutdown()
|
||||
}
|
||||
}
|
||||
nChan = 0;
|
||||
// Noch was zu PRINTen?
|
||||
// anything left to PRINT?
|
||||
if( aOut.Len() )
|
||||
{
|
||||
String aOutStr( aOut, gsl_getSystemTextEncoding() );
|
||||
@ -823,7 +820,6 @@ void SbiIoSystem::Shutdown()
|
||||
aOut.Erase();
|
||||
}
|
||||
|
||||
// Aus aktuellem Kanal lesen
|
||||
|
||||
void SbiIoSystem::Read( ByteString& rBuf, short n )
|
||||
{
|
||||
@ -907,7 +903,6 @@ void SbiIoSystem::CloseAll(void)
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
// Einlesen einer Zeile von der Console
|
||||
|
||||
void SbiIoSystem::ReadCon( ByteString& rIn )
|
||||
{
|
||||
@ -920,7 +915,7 @@ void SbiIoSystem::ReadCon( ByteString& rIn )
|
||||
aPrompt.Erase();
|
||||
}
|
||||
|
||||
// Ausgabe einer MessageBox, wenn im Console-Puffer ein CR ist
|
||||
// output of a MessageBox, if theres a CR in the console-buffer
|
||||
|
||||
void SbiIoSystem::WriteCon( const ByteString& rText )
|
||||
{
|
||||
|
@ -141,7 +141,7 @@ static long GetDayDiff( const Date& rDate )
|
||||
}
|
||||
else
|
||||
nDiffDays = (long)(rDate - aRefDate);
|
||||
nDiffDays += 2; // Anpassung VisualBasic: 1.Jan.1900 == 2
|
||||
nDiffDays += 2; // adjustment VisualBasic: 1.Jan.1900 == 2
|
||||
return nDiffDays;
|
||||
}
|
||||
|
||||
@ -202,9 +202,8 @@ static com::sun::star::uno::Reference< XSimpleFileAccess3 > getFileAccess( void
|
||||
|
||||
|
||||
|
||||
// Properties und Methoden legen beim Get (bPut = sal_False) den Returnwert
|
||||
// im Element 0 des Argv ab; beim Put (bPut = sal_True) wird der Wert aus
|
||||
// Element 0 gespeichert.
|
||||
// Properties and methods lie down the return value at the Get (bPut = sal_False) in the
|
||||
// element 0 of the Argv; the value of element 0 is saved at Put (bPut = sal_True)
|
||||
|
||||
// CreateObject( class )
|
||||
|
||||
@ -218,7 +217,7 @@ RTLFUNC(CreateObject)
|
||||
StarBASIC::Error( SbERR_CANNOT_LOAD );
|
||||
else
|
||||
{
|
||||
// Convenience: BASIC als Parent eintragen
|
||||
// Convenience: enter BASIC as parent
|
||||
p->SetParent( pBasic );
|
||||
rPar.Get( 0 )->PutObject( p );
|
||||
}
|
||||
@ -291,7 +290,6 @@ RTLFUNC(Sin)
|
||||
}
|
||||
}
|
||||
|
||||
// Cosinus
|
||||
|
||||
RTLFUNC(Cos)
|
||||
{
|
||||
@ -307,7 +305,6 @@ RTLFUNC(Cos)
|
||||
}
|
||||
}
|
||||
|
||||
// Atn
|
||||
|
||||
RTLFUNC(Atn)
|
||||
{
|
||||
@ -417,10 +414,10 @@ RTLFUNC(CurDir)
|
||||
(void)pBasic;
|
||||
(void)bWrite;
|
||||
|
||||
// #57064 Obwohl diese Funktion nicht mit DirEntry arbeitet, ist sie von
|
||||
// der Anpassung an virtuelle URLs nich betroffen, da bei Nutzung der
|
||||
// DirEntry-Funktionalitaet keine Moeglichkeit besteht, das aktuelle so
|
||||
// zu ermitteln, dass eine virtuelle URL geliefert werden koennte.
|
||||
// #57064 Although this function doesn't work with DirEntry, it isn't touched
|
||||
// by the adjustment to virtual URLs, as, using the DirEntry-functionality,
|
||||
// there's no possibility to detect the current one in a way that a virtual URL
|
||||
// could be delivered.
|
||||
|
||||
#if defined (WNT)
|
||||
int nCurDir = 0; // Current dir // JSM
|
||||
@ -1208,10 +1205,10 @@ RTLFUNC(Mid)
|
||||
StarBASIC::Error( SbERR_BAD_ARGUMENT );
|
||||
else
|
||||
{
|
||||
// #23178: Funktionalitaet von Mid$ als Anweisung nachbilden, indem
|
||||
// als weiterer (4.) Parameter ein Ersetzungsstring aufgenommen wird.
|
||||
// Anders als im Original kann in dieser Variante der 3. Parameter
|
||||
// nLength nicht weggelassen werden. Ist ueber bWrite schon vorgesehen.
|
||||
// #23178: replicate the functionality of Mid$ as a command
|
||||
// by adding a replacement-string as a fourth parameter.
|
||||
// In contrast to the original the third parameter (nLength)
|
||||
// can't be left out here. That's considered in bWrite already.
|
||||
if( nArgCount == 4 )
|
||||
bWrite = sal_True;
|
||||
|
||||
@ -1527,7 +1524,7 @@ RTLFUNC(Str)
|
||||
// Numbers start with a space
|
||||
if( pArg->IsNumericRTL() )
|
||||
{
|
||||
// Kommas durch Punkte ersetzen, damit es symmetrisch zu Val ist!
|
||||
// replace commas by points so that it's symmetric to Val!
|
||||
aStr.SearchAndReplace( ',', '.' );
|
||||
|
||||
SbiInstance* pInst = pINST;
|
||||
@ -1712,7 +1709,7 @@ RTLFUNC(Val)
|
||||
}
|
||||
else
|
||||
{
|
||||
// #57844 Lokalisierte Funktion benutzen
|
||||
// #57844 use localized function
|
||||
nResult = ::rtl::math::stringToDouble( aStr, '.', ',', NULL, NULL );
|
||||
checkArithmeticOverflow( nResult );
|
||||
}
|
||||
@ -1725,7 +1722,7 @@ RTLFUNC(Val)
|
||||
// Helper functions for date conversion
|
||||
sal_Int16 implGetDateDay( double aDate )
|
||||
{
|
||||
aDate -= 2.0; // normieren: 1.1.1900 => 0.0
|
||||
aDate -= 2.0; // standardize: 1.1.1900 => 0.0
|
||||
Date aRefDate( 1, 1, 1900 );
|
||||
if ( aDate >= 0.0 )
|
||||
{
|
||||
@ -1746,7 +1743,7 @@ sal_Int16 implGetDateMonth( double aDate )
|
||||
{
|
||||
Date aRefDate( 1,1,1900 );
|
||||
long nDays = (long)aDate;
|
||||
nDays -= 2; // normieren: 1.1.1900 => 0.0
|
||||
nDays -= 2; // standardize: 1.1.1900 => 0.0
|
||||
aRefDate += nDays;
|
||||
sal_Int16 nRet = (sal_Int16)( aRefDate.GetMonth() );
|
||||
return nRet;
|
||||
@ -1756,7 +1753,7 @@ sal_Int16 implGetDateYear( double aDate )
|
||||
{
|
||||
Date aRefDate( 1,1,1900 );
|
||||
long nDays = (long) aDate;
|
||||
nDays -= 2; // normieren: 1.1.1900 => 0.0
|
||||
nDays -= 2; // standardize: 1.1.1900 => 0.0
|
||||
aRefDate += nDays;
|
||||
sal_Int16 nRet = (sal_Int16)( aRefDate.GetYear() );
|
||||
return nRet;
|
||||
@ -1893,7 +1890,7 @@ RTLFUNC(TimeSerial)
|
||||
}
|
||||
sal_Int16 nHour = rPar.Get(1)->GetInteger();
|
||||
if ( nHour == 24 )
|
||||
nHour = 0; // Wegen UNO DateTimes, die bis 24 Uhr gehen
|
||||
nHour = 0; // because of UNO DateTimes, which go till 24 o'clock
|
||||
sal_Int16 nMinute = rPar.Get(2)->GetInteger();
|
||||
sal_Int16 nSecond = rPar.Get(3)->GetInteger();
|
||||
if ((nHour < 0 || nHour > 23) ||
|
||||
@ -1921,7 +1918,7 @@ RTLFUNC(DateValue)
|
||||
StarBASIC::Error( SbERR_BAD_ARGUMENT );
|
||||
else
|
||||
{
|
||||
// #39629 pINST pruefen, kann aus URL-Zeile gerufen werden
|
||||
// #39629 check pINST, can be called from the URL line
|
||||
SvNumberFormatter* pFormatter = NULL;
|
||||
if( pINST )
|
||||
pFormatter = pINST->GetNumberFormatter();
|
||||
@ -1956,7 +1953,7 @@ RTLFUNC(DateValue)
|
||||
{
|
||||
if ( nType == NUMBERFORMAT_DATETIME )
|
||||
{
|
||||
// Zeit abschneiden
|
||||
// cut time
|
||||
if ( fResult > 0.0 )
|
||||
fResult = floor( fResult );
|
||||
else
|
||||
@ -1967,7 +1964,7 @@ RTLFUNC(DateValue)
|
||||
else
|
||||
StarBASIC::Error( SbERR_CONVERSION );
|
||||
|
||||
// #39629 pFormatter kann selbst angefordert sein
|
||||
// #39629 pFormatter can be requested itself
|
||||
if( !pINST )
|
||||
delete pFormatter;
|
||||
}
|
||||
@ -1982,13 +1979,12 @@ RTLFUNC(TimeValue)
|
||||
StarBASIC::Error( SbERR_BAD_ARGUMENT );
|
||||
else
|
||||
{
|
||||
// #39629 pINST pruefen, kann aus URL-Zeile gerufen werden
|
||||
SvNumberFormatter* pFormatter = NULL;
|
||||
if( pINST )
|
||||
pFormatter = pINST->GetNumberFormatter();
|
||||
else
|
||||
{
|
||||
sal_uInt32 n; // Dummy
|
||||
sal_uInt32 n;
|
||||
SbiInstance::PrepareNumberFormatter( pFormatter, n, n, n );
|
||||
}
|
||||
|
||||
@ -2000,14 +1996,13 @@ RTLFUNC(TimeValue)
|
||||
if(bSuccess && (nType==NUMBERFORMAT_TIME||nType==NUMBERFORMAT_DATETIME))
|
||||
{
|
||||
if ( nType == NUMBERFORMAT_DATETIME )
|
||||
// Tage abschneiden
|
||||
// cut days
|
||||
fResult = fmod( fResult, 1 );
|
||||
rPar.Get(0)->PutDate( fResult );
|
||||
}
|
||||
else
|
||||
StarBASIC::Error( SbERR_CONVERSION );
|
||||
|
||||
// #39629 pFormatter kann selbst angefordert sein
|
||||
if( !pINST )
|
||||
delete pFormatter;
|
||||
}
|
||||
@ -2194,7 +2189,6 @@ RTLFUNC(Time)
|
||||
double nDays = (double)nSeconds * ( 1.0 / (24.0*3600.0) );
|
||||
Color* pCol;
|
||||
|
||||
// #39629 pINST pruefen, kann aus URL-Zeile gerufen werden
|
||||
SvNumberFormatter* pFormatter = NULL;
|
||||
sal_uInt32 nIndex;
|
||||
if( pINST )
|
||||
@ -2210,7 +2204,6 @@ RTLFUNC(Time)
|
||||
|
||||
pFormatter->GetOutputString( nDays, nIndex, aRes, &pCol );
|
||||
|
||||
// #39629 pFormatter kann selbst angefordert sein
|
||||
if( !pINST )
|
||||
delete pFormatter;
|
||||
}
|
||||
@ -2251,7 +2244,6 @@ RTLFUNC(Date)
|
||||
String aRes;
|
||||
Color* pCol;
|
||||
|
||||
// #39629 pINST pruefen, kann aus URL-Zeile gerufen werden
|
||||
SvNumberFormatter* pFormatter = NULL;
|
||||
sal_uInt32 nIndex;
|
||||
if( pINST )
|
||||
@ -2261,14 +2253,13 @@ RTLFUNC(Date)
|
||||
}
|
||||
else
|
||||
{
|
||||
sal_uInt32 n; // Dummy
|
||||
sal_uInt32 n;
|
||||
SbiInstance::PrepareNumberFormatter( pFormatter, nIndex, n, n );
|
||||
}
|
||||
|
||||
pFormatter->GetOutputString( nDays, nIndex, aRes, &pCol );
|
||||
pMeth->PutString( aRes );
|
||||
|
||||
// #39629 pFormatter kann selbst angefordert sein
|
||||
if( !pINST )
|
||||
delete pFormatter;
|
||||
}
|
||||
@ -2330,7 +2321,7 @@ RTLFUNC(IsDate)
|
||||
StarBASIC::Error( SbERR_BAD_ARGUMENT );
|
||||
else
|
||||
{
|
||||
// #46134 Nur String wird konvertiert, andere Typen ergeben sal_False
|
||||
// #46134 only string is converted, all other types result in sal_False
|
||||
SbxVariableRef xArg = rPar.Get( 1 );
|
||||
SbxDataType eType = xArg->GetType();
|
||||
sal_Bool bDate = sal_False;
|
||||
@ -2341,17 +2332,14 @@ RTLFUNC(IsDate)
|
||||
}
|
||||
else if( eType == SbxSTRING )
|
||||
{
|
||||
// Error loeschen
|
||||
SbxError nPrevError = SbxBase::GetError();
|
||||
SbxBase::ResetError();
|
||||
|
||||
// Konvertierung des Parameters nach SbxDATE erzwingen
|
||||
// force conversion of the parameter to SbxDATE
|
||||
xArg->SbxValue::GetDate();
|
||||
|
||||
// Bei Fehler ist es kein Date
|
||||
bDate = !SbxBase::IsError();
|
||||
|
||||
// Error-Situation wiederherstellen
|
||||
SbxBase::ResetError();
|
||||
SbxBase::SetError( nPrevError );
|
||||
}
|
||||
@ -2416,8 +2404,8 @@ RTLFUNC(IsNull)
|
||||
StarBASIC::Error( SbERR_BAD_ARGUMENT );
|
||||
else
|
||||
{
|
||||
// #51475 Wegen Uno-Objekten auch true liefern,
|
||||
// wenn der pObj-Wert NULL ist
|
||||
// #51475 because of Uno-objects return true
|
||||
// even if the pObj value is NULL
|
||||
SbxVariableRef pArg = rPar.Get( 1 );
|
||||
sal_Bool bNull = rPar.Get(1)->IsNull();
|
||||
if( !bNull && pArg->GetType() == SbxOBJECT )
|
||||
@ -2441,7 +2429,7 @@ RTLFUNC(IsNumeric)
|
||||
rPar.Get( 0 )->PutBool( rPar.Get( 1 )->IsNumericRTL() );
|
||||
}
|
||||
|
||||
// Das machen wir auf die billige Tour
|
||||
|
||||
|
||||
RTLFUNC(IsMissing)
|
||||
{
|
||||
@ -2451,7 +2439,7 @@ RTLFUNC(IsMissing)
|
||||
if ( rPar.Count() < 2 )
|
||||
StarBASIC::Error( SbERR_BAD_ARGUMENT );
|
||||
else
|
||||
// #57915 Missing wird durch Error angezeigt
|
||||
// #57915 Missing is reported by an error
|
||||
rPar.Get( 0 )->PutBool( rPar.Get(1)->IsErr() );
|
||||
}
|
||||
|
||||
@ -2573,8 +2561,8 @@ RTLFUNC(Dir)
|
||||
{
|
||||
SbiRTLData* pRTLData = pINST->GetRTLData();
|
||||
|
||||
// #34645: Kann auch von der URL-Zeile ueber 'macro: Dir' aufgerufen werden
|
||||
// dann existiert kein pRTLData und die Methode muss verlassen werden
|
||||
// #34645: can also be called from the URL line via 'macro: Dir'
|
||||
// there's no pRTLDate existing in that case and the method must be left
|
||||
if( !pRTLData )
|
||||
return;
|
||||
|
||||
@ -2837,7 +2825,7 @@ RTLFUNC(GetAttr)
|
||||
DirEntry aEntry( rPar.Get(1)->GetString() );
|
||||
aEntry.ToAbs();
|
||||
|
||||
// #57064 Bei virtuellen URLs den Real-Path extrahieren
|
||||
// #57064 extract the real-path for virtual URLs
|
||||
ByteString aByteStrFullPath( aEntry.GetFull(), gsl_getSystemTextEncoding() );
|
||||
DWORD nRealFlags = GetFileAttributes (aByteStrFullPath.GetBuffer());
|
||||
if (nRealFlags != 0xffffffff)
|
||||
@ -2964,7 +2952,6 @@ RTLFUNC(FileDateTime)
|
||||
|
||||
Color* pCol;
|
||||
|
||||
// #39629 pINST pruefen, kann aus URL-Zeile gerufen werden
|
||||
SvNumberFormatter* pFormatter = NULL;
|
||||
sal_uInt32 nIndex;
|
||||
if( pINST )
|
||||
@ -2974,7 +2961,7 @@ RTLFUNC(FileDateTime)
|
||||
}
|
||||
else
|
||||
{
|
||||
sal_uInt32 n; // Dummy
|
||||
sal_uInt32 n;
|
||||
SbiInstance::PrepareNumberFormatter( pFormatter, n, n, nIndex );
|
||||
}
|
||||
|
||||
@ -2982,7 +2969,6 @@ RTLFUNC(FileDateTime)
|
||||
pFormatter->GetOutputString( fSerial, nIndex, aRes, &pCol );
|
||||
rPar.Get(0)->PutString( aRes );
|
||||
|
||||
// #39629 pFormatter kann selbst angefordert sein
|
||||
if( !pINST )
|
||||
delete pFormatter;
|
||||
}
|
||||
@ -3012,13 +2998,13 @@ RTLFUNC(EOF)
|
||||
if ( pSbStrm->IsText() )
|
||||
{
|
||||
char cBla;
|
||||
(*pSvStrm) >> cBla; // koennen wir noch ein Zeichen lesen
|
||||
(*pSvStrm) >> cBla; // can we read another character?
|
||||
bIsEof = pSvStrm->IsEof();
|
||||
if ( !bIsEof )
|
||||
pSvStrm->SeekRel( -1 );
|
||||
}
|
||||
else
|
||||
bIsEof = pSvStrm->IsEof(); // fuer binaerdateien!
|
||||
bIsEof = pSvStrm->IsEof(); // for binary data!
|
||||
rPar.Get(0)->PutBool( bIsEof );
|
||||
}
|
||||
}
|
||||
@ -3029,9 +3015,9 @@ RTLFUNC(FileAttr)
|
||||
(void)bWrite;
|
||||
|
||||
// No changes for UCB
|
||||
// #57064 Obwohl diese Funktion nicht mit DirEntry arbeitet, ist sie von
|
||||
// der Anpassung an virtuelle URLs nich betroffen, da sie nur auf bereits
|
||||
// geoeffneten Dateien arbeitet und der Name hier keine Rolle spielt.
|
||||
// #57064 Although this function doesn't operate with DirEntry, it is
|
||||
// not touched by the adjustment to virtual URLs, as it only works on
|
||||
// already opened files and the name doesn't matter there.
|
||||
|
||||
if ( rPar.Count() != 3 )
|
||||
StarBASIC::Error( SbERR_BAD_ARGUMENT );
|
||||
@ -3078,7 +3064,7 @@ RTLFUNC(Loc)
|
||||
{
|
||||
short nBlockLen = pSbStrm->GetBlockLen();
|
||||
nPos = nBlockLen ? (pSvStrm->Tell() / nBlockLen) : 0;
|
||||
nPos++; // Blockpositionen beginnen bei 1
|
||||
nPos++; // block positions starting at 1
|
||||
}
|
||||
else if ( pSbStrm->IsText() )
|
||||
nPos = pSbStrm->GetLine();
|
||||
@ -3146,7 +3132,7 @@ RTLFUNC(Seek)
|
||||
sal_uIntPtr nPos = pStrm->Tell();
|
||||
if( pSbStrm->IsRandom() )
|
||||
nPos = nPos / pSbStrm->GetBlockLen();
|
||||
nPos++; // Basic zaehlt ab 1
|
||||
nPos++; // Basic counts from 1
|
||||
rPar.Get(0)->PutLong( (sal_Int32)nPos );
|
||||
}
|
||||
else // Seek-Statement
|
||||
@ -3157,7 +3143,7 @@ RTLFUNC(Seek)
|
||||
StarBASIC::Error( SbERR_BAD_ARGUMENT );
|
||||
return;
|
||||
}
|
||||
nPos--; // Basic zaehlt ab 1, SvStreams zaehlen ab 0
|
||||
nPos--; // Basic counts from 1, SvStreams count from 0
|
||||
pSbStrm->SetExpandOnWriteTo( 0 );
|
||||
if ( pSbStrm->IsRandom() )
|
||||
nPos *= pSbStrm->GetBlockLen();
|
||||
@ -3251,7 +3237,7 @@ RTLFUNC(Shell)
|
||||
oslProcessOption nOptions = osl_Process_SEARCHPATH | osl_Process_DETACHED;
|
||||
|
||||
String aCmdLine = rPar.Get(1)->GetString();
|
||||
// Zusaetzliche Parameter anhaengen, es muss eh alles geparsed werden
|
||||
// attach additional parameters - everything must be parsed anyway
|
||||
if( nArgCount >= 4 )
|
||||
{
|
||||
aCmdLine.AppendAscii( " " );
|
||||
@ -3259,20 +3245,19 @@ RTLFUNC(Shell)
|
||||
}
|
||||
else if( !aCmdLine.Len() )
|
||||
{
|
||||
// Spezial-Behandlung (leere Liste) vermeiden
|
||||
// avaoid special treatment (empty list)
|
||||
aCmdLine.AppendAscii( " " );
|
||||
}
|
||||
sal_uInt16 nLen = aCmdLine.Len();
|
||||
|
||||
// #55735 Wenn Parameter dabei sind, muessen die abgetrennt werden
|
||||
// #72471 Auch die einzelnen Parameter trennen
|
||||
// #55735 if there are parameters, they have to be seperated
|
||||
// #72471 also seperate the single parameters
|
||||
std::list<String> aTokenList;
|
||||
String aToken;
|
||||
sal_uInt16 i = 0;
|
||||
sal_Unicode c;
|
||||
while( i < nLen )
|
||||
{
|
||||
// Spaces weg
|
||||
for ( ;; ++i )
|
||||
{
|
||||
c = aCmdLine.GetBuffer()[ i ];
|
||||
@ -3284,7 +3269,6 @@ RTLFUNC(Shell)
|
||||
{
|
||||
sal_uInt16 iFoundPos = aCmdLine.Search( c, i + 1 );
|
||||
|
||||
// Wenn nichts gefunden wurde, Rest kopieren
|
||||
if( iFoundPos == STRING_NOTFOUND )
|
||||
{
|
||||
aToken = aCmdLine.Copy( i, STRING_LEN );
|
||||
@ -3302,7 +3286,6 @@ RTLFUNC(Shell)
|
||||
sal_uInt16 iFoundTabPos = aCmdLine.Search( '\t', i );
|
||||
sal_uInt16 iFoundPos = Min( iFoundSpacePos, iFoundTabPos );
|
||||
|
||||
// Wenn nichts gefunden wurde, Rest kopieren
|
||||
if( iFoundPos == STRING_NOTFOUND )
|
||||
{
|
||||
aToken = aCmdLine.Copy( i, STRING_LEN );
|
||||
@ -3315,10 +3298,10 @@ RTLFUNC(Shell)
|
||||
}
|
||||
}
|
||||
|
||||
// In die Liste uebernehmen
|
||||
// insert into the list
|
||||
aTokenList.push_back( aToken );
|
||||
}
|
||||
// #55735 / #72471 Ende
|
||||
// #55735 / #72471 end
|
||||
|
||||
sal_Int16 nWinStyle = 0;
|
||||
if( nArgCount >= 3 )
|
||||
@ -3344,7 +3327,7 @@ RTLFUNC(Shell)
|
||||
nOptions |= osl_Process_WAIT;
|
||||
}
|
||||
|
||||
// #72471 Parameter aufbereiten
|
||||
// #72471 work parameter(s) up
|
||||
std::list<String>::const_iterator iter = aTokenList.begin();
|
||||
const String& rStr = *iter;
|
||||
::rtl::OUString aOUStrProg( rStr.GetBuffer(), rStr.Len() );
|
||||
@ -4031,7 +4014,7 @@ RTLFUNC(Load)
|
||||
return;
|
||||
}
|
||||
|
||||
// Diesen Call einfach an das Object weiterreichen
|
||||
|
||||
SbxBase* pObj = (SbxObject*)rPar.Get(1)->GetObject();
|
||||
if ( pObj )
|
||||
{
|
||||
@ -4061,7 +4044,7 @@ RTLFUNC(Unload)
|
||||
return;
|
||||
}
|
||||
|
||||
// Diesen Call einfach an das Object weitereichen
|
||||
|
||||
SbxBase* pObj = (SbxObject*)rPar.Get(1)->GetObject();
|
||||
if ( pObj )
|
||||
{
|
||||
@ -4172,7 +4155,7 @@ RTLFUNC(MsgBox)
|
||||
if( nArgCount >= 3 )
|
||||
nType = (WinBits)rPar.Get(2)->GetInteger();
|
||||
WinBits nStyle = nType;
|
||||
nStyle &= 15; // Bits 4-16 loeschen
|
||||
nStyle &= 15; // delete bits 4-16
|
||||
if( nStyle > 5 )
|
||||
nStyle = 0;
|
||||
|
||||
|
@ -331,7 +331,7 @@ RTLFUNC(CDbl) // JSM
|
||||
SbxVariable *pSbxVariable = rPar.Get(1);
|
||||
if( pSbxVariable->GetType() == SbxSTRING )
|
||||
{
|
||||
// AB #41690 , String holen
|
||||
// #41690
|
||||
String aScanStr = pSbxVariable->GetString();
|
||||
SbError Error = SbxValue::ScanNumIntnl( aScanStr, nVal );
|
||||
if( Error != SbxERR_OK )
|
||||
@ -393,7 +393,7 @@ RTLFUNC(CSng) // JSM
|
||||
SbxVariable *pSbxVariable = rPar.Get(1);
|
||||
if( pSbxVariable->GetType() == SbxSTRING )
|
||||
{
|
||||
// AB #41690 , String holen
|
||||
// #41690
|
||||
double dVal = 0.0;
|
||||
String aScanStr = pSbxVariable->GetString();
|
||||
SbError Error = SbxValue::ScanNumIntnl( aScanStr, dVal, /*bSingle=*/sal_True );
|
||||
@ -566,7 +566,7 @@ RTLFUNC(Switch)
|
||||
|
||||
sal_uInt16 nCount = rPar.Count();
|
||||
if( !(nCount & 0x0001 ))
|
||||
// Anzahl der Argumente muss ungerade sein
|
||||
// number of arguments must be odd
|
||||
StarBASIC::Error( SbERR_BAD_ARGUMENT );
|
||||
sal_uInt16 nCurExpr = 1;
|
||||
while( nCurExpr < (nCount-1) )
|
||||
@ -764,7 +764,7 @@ RTLFUNC(Array)
|
||||
SbxDimArray* pArray = new SbxDimArray( SbxVARIANT );
|
||||
sal_uInt16 nArraySize = rPar.Count() - 1;
|
||||
|
||||
// Option Base zunaechst ignorieren (kennt leider nur der Compiler)
|
||||
// ignore Option Base so far (unfortunately only known by the compiler)
|
||||
bool bIncIndex = (IsBaseIndexOne() && SbiRuntime::isVBAEnabled() );
|
||||
if( nArraySize )
|
||||
{
|
||||
@ -778,7 +778,7 @@ RTLFUNC(Array)
|
||||
pArray->unoAddDim( 0, -1 );
|
||||
}
|
||||
|
||||
// Parameter ins Array uebernehmen
|
||||
// insert parameters into the array
|
||||
// ATTENTION: Using type sal_uInt16 for loop variable is
|
||||
// mandatory to workaround a problem with the
|
||||
// Solaris Intel compiler optimizer! See i104354
|
||||
@ -793,7 +793,7 @@ RTLFUNC(Array)
|
||||
pArray->Put( pNew, &index );
|
||||
}
|
||||
|
||||
// Array zurueckliefern
|
||||
// return array
|
||||
SbxVariableRef refVar = rPar.Get(0);
|
||||
sal_uInt16 nFlags = refVar->GetFlags();
|
||||
refVar->ResetFlag( SBX_FIXED );
|
||||
@ -803,13 +803,13 @@ RTLFUNC(Array)
|
||||
}
|
||||
|
||||
|
||||
// Featurewunsch #57868
|
||||
// Die Funktion liefert ein Variant-Array, wenn keine Parameter angegeben
|
||||
// werden, wird ein leeres Array erzeugt (entsprechend dim a(), entspricht
|
||||
// einer Sequence der Laenge 0 in Uno).
|
||||
// Wenn Parameter angegeben sind, wird fuer jeden eine Dimension erzeugt
|
||||
// DimArray( 2, 2, 4 ) entspricht DIM a( 2, 2, 4 )
|
||||
// Das Array ist immer vom Typ Variant
|
||||
// Featurewish #57868
|
||||
// The function returns a variant-array; if there are no parameters passed,
|
||||
// an empty array is created (according to dim a(); equal to a sequence of
|
||||
// the length 0 in Uno).
|
||||
// If there are parameters passed, there's a dimension created for each of
|
||||
// them; DimArray( 2, 2, 4 ) is equal to DIM a( 2, 2, 4 )
|
||||
// the array is always of the type variant
|
||||
RTLFUNC(DimArray)
|
||||
{
|
||||
(void)pBasic;
|
||||
@ -833,7 +833,6 @@ RTLFUNC(DimArray)
|
||||
else
|
||||
pArray->unoAddDim( 0, -1 );
|
||||
|
||||
// Array zurueckliefern
|
||||
SbxVariableRef refVar = rPar.Get(0);
|
||||
sal_uInt16 nFlags = refVar->GetFlags();
|
||||
refVar->ResetFlag( SBX_FIXED );
|
||||
@ -843,14 +842,14 @@ RTLFUNC(DimArray)
|
||||
}
|
||||
|
||||
/*
|
||||
* FindObject und FindPropertyObject ermoeglichen es,
|
||||
* Objekte und Properties vom Typ Objekt zur Laufzeit
|
||||
* ueber ihren Namen als String-Parameter anzusprechen.
|
||||
* FindObject and FindPropertyObject make it possible to
|
||||
* address objects and properties of the type Object with
|
||||
* their name as string-pararmeters at the runtime.
|
||||
*
|
||||
* Bsp.:
|
||||
* Example:
|
||||
* MyObj.Prop1.Bla = 5
|
||||
*
|
||||
* entspricht:
|
||||
* is equal to:
|
||||
* dim ObjVar as Object
|
||||
* dim ObjProp as Object
|
||||
* ObjName$ = "MyObj"
|
||||
@ -859,56 +858,49 @@ RTLFUNC(DimArray)
|
||||
* ObjProp = FindPropertyObject( ObjVar, PropName$ )
|
||||
* ObjProp.Bla = 5
|
||||
*
|
||||
* Dabei koennen die Namen zur Laufzeit dynamisch
|
||||
* erzeugt werden und, so dass z.B. ueber Controls
|
||||
* "TextEdit1" bis "TextEdit5" in einem Dialog in
|
||||
* einer Schleife iteriert werden kann.
|
||||
* The names can be created dynamically at the runtime
|
||||
* so that e. g. via controls "TextEdit1" to "TextEdit5"
|
||||
* can be iterated in a dialog in a loop.
|
||||
*/
|
||||
|
||||
// Objekt ueber den Namen ansprechen
|
||||
// 1. Parameter = Name des Objekts als String
|
||||
|
||||
// 1st parameter = the object's name as string
|
||||
RTLFUNC(FindObject)
|
||||
{
|
||||
(void)pBasic;
|
||||
(void)bWrite;
|
||||
|
||||
// Wir brauchen einen Parameter
|
||||
if ( rPar.Count() < 2 )
|
||||
{
|
||||
StarBASIC::Error( SbERR_BAD_ARGUMENT );
|
||||
return;
|
||||
}
|
||||
|
||||
// 1. Parameter ist der Name
|
||||
String aNameStr = rPar.Get(1)->GetString();
|
||||
|
||||
// Basic-Suchfunktion benutzen
|
||||
SbxBase* pFind = StarBASIC::FindSBXInCurrentScope( aNameStr );
|
||||
SbxObject* pFindObj = NULL;
|
||||
if( pFind )
|
||||
pFindObj = PTR_CAST(SbxObject,pFind);
|
||||
|
||||
// Objekt zurueckliefern
|
||||
SbxVariableRef refVar = rPar.Get(0);
|
||||
refVar->PutObject( pFindObj );
|
||||
}
|
||||
|
||||
// Objekt-Property in einem Objekt ansprechen
|
||||
// 1. Parameter = Objekt
|
||||
// 2. Parameter = Name der Property als String
|
||||
// address object-property in an object
|
||||
// 1st parameter = object
|
||||
// 2nd parameter = the property's name as string
|
||||
RTLFUNC(FindPropertyObject)
|
||||
{
|
||||
(void)pBasic;
|
||||
(void)bWrite;
|
||||
|
||||
// Wir brauchen 2 Parameter
|
||||
if ( rPar.Count() < 3 )
|
||||
{
|
||||
StarBASIC::Error( SbERR_BAD_ARGUMENT );
|
||||
return;
|
||||
}
|
||||
|
||||
// 1. Parameter holen, muss Objekt sein
|
||||
SbxBase* pObjVar = (SbxObject*)rPar.Get(1)->GetObject();
|
||||
SbxObject* pObj = NULL;
|
||||
if( pObjVar )
|
||||
@ -919,21 +911,18 @@ RTLFUNC(FindPropertyObject)
|
||||
pObj = PTR_CAST(SbxObject,pObjVarObj);
|
||||
}
|
||||
|
||||
// 2. Parameter ist der Name
|
||||
String aNameStr = rPar.Get(2)->GetString();
|
||||
|
||||
// Jetzt muss ein Objekt da sein, sonst Error
|
||||
SbxObject* pFindObj = NULL;
|
||||
if( pObj )
|
||||
{
|
||||
// Im Objekt nach Objekt suchen
|
||||
SbxVariable* pFindVar = pObj->Find( aNameStr, SbxCLASS_OBJECT );
|
||||
pFindObj = PTR_CAST(SbxObject,pFindVar);
|
||||
}
|
||||
else
|
||||
StarBASIC::Error( SbERR_BAD_PARAMETER );
|
||||
|
||||
// Objekt zurueckliefern
|
||||
|
||||
SbxVariableRef refVar = rPar.Get(0);
|
||||
refVar->PutObject( pFindObj );
|
||||
}
|
||||
@ -1008,7 +997,7 @@ sal_Bool lcl_WriteSbxVariable( const SbxVariable& rVar, SvStream* pStrm,
|
||||
}
|
||||
else
|
||||
{
|
||||
// ohne Laengenangabe! ohne Endekennung!
|
||||
// without any length information! without end-identifier!
|
||||
// What does that mean for Unicode?! Choosing conversion to ByteString...
|
||||
ByteString aByteStr( rStr, gsl_getSystemTextEncoding() );
|
||||
*pStrm << (const char*)aByteStr.GetBuffer();
|
||||
@ -1166,7 +1155,6 @@ sal_Bool lcl_WriteReadSbxArray( SbxDimArray& rArr, SvStream* pStrm,
|
||||
|
||||
void PutGet( SbxArray& rPar, sal_Bool bPut )
|
||||
{
|
||||
// Wir brauchen 3 Parameter
|
||||
if ( rPar.Count() != 4 )
|
||||
{
|
||||
StarBASIC::Error( SbERR_BAD_ARGUMENT );
|
||||
@ -1182,10 +1170,10 @@ void PutGet( SbxArray& rPar, sal_Bool bPut )
|
||||
StarBASIC::Error( SbERR_BAD_ARGUMENT );
|
||||
return;
|
||||
}
|
||||
nRecordNo--; // wir moegen's ab 0!
|
||||
nRecordNo--;
|
||||
SbiIoSystem* pIO = pINST->GetIoSystem();
|
||||
SbiStream* pSbStrm = pIO->GetStream( nFileNo );
|
||||
// das File muss Random (feste Record-Laenge) oder Binary sein
|
||||
|
||||
if ( !pSbStrm || !(pSbStrm->GetMode() & (SBSTRM_BINARY | SBSTRM_RANDOM)) )
|
||||
{
|
||||
StarBASIC::Error( SbERR_BAD_CHANNEL );
|
||||
@ -1198,11 +1186,9 @@ void PutGet( SbxArray& rPar, sal_Bool bPut )
|
||||
|
||||
if( bPut )
|
||||
{
|
||||
// Datei aufplustern, falls jemand uebers Dateiende hinaus geseekt hat
|
||||
pSbStrm->ExpandFile();
|
||||
}
|
||||
|
||||
// auf die Startposition seeken
|
||||
if( bHasRecordNo )
|
||||
{
|
||||
sal_uIntPtr nFilePos = bRandom ? (sal_uIntPtr)(nBlockLen*nRecordNo) : (sal_uIntPtr)nRecordNo;
|
||||
@ -1267,7 +1253,7 @@ RTLFUNC(Environ)
|
||||
return;
|
||||
}
|
||||
String aResult;
|
||||
// sollte ANSI sein, aber unter Win16 in DLL nicht moeglich
|
||||
// should be ANSI but that's not possible under Win16 in the DLL
|
||||
ByteString aByteStr( rPar.Get(1)->GetString(), gsl_getSystemTextEncoding() );
|
||||
const char* pEnvStr = getenv( aByteStr.GetBuffer() );
|
||||
if ( pEnvStr )
|
||||
@ -1461,8 +1447,7 @@ RTLFUNC(TypeLen)
|
||||
}
|
||||
|
||||
|
||||
// Uno-Struct eines beliebigen Typs erzeugen
|
||||
// 1. Parameter == Klassename, weitere Parameter zur Initialisierung
|
||||
// 1st parameter == class name, other parameters for initialisation
|
||||
RTLFUNC(CreateUnoStruct)
|
||||
{
|
||||
(void)pBasic;
|
||||
@ -1471,8 +1456,8 @@ RTLFUNC(CreateUnoStruct)
|
||||
RTL_Impl_CreateUnoStruct( pBasic, rPar, bWrite );
|
||||
}
|
||||
|
||||
// Uno-Service erzeugen
|
||||
// 1. Parameter == Service-Name
|
||||
|
||||
// 1st parameter == service-name
|
||||
RTLFUNC(CreateUnoService)
|
||||
{
|
||||
(void)pBasic;
|
||||
@ -1499,7 +1484,7 @@ RTLFUNC(CreateUnoValue)
|
||||
}
|
||||
|
||||
|
||||
// ServiceManager liefern (keine Parameter)
|
||||
// no parameters
|
||||
RTLFUNC(GetProcessServiceManager)
|
||||
{
|
||||
(void)pBasic;
|
||||
@ -1508,8 +1493,8 @@ RTLFUNC(GetProcessServiceManager)
|
||||
RTL_Impl_GetProcessServiceManager( pBasic, rPar, bWrite );
|
||||
}
|
||||
|
||||
// PropertySet erzeugen
|
||||
// 1. Parameter == Sequence<PropertyValue>
|
||||
|
||||
// 1st parameter == Sequence<PropertyValue>
|
||||
RTLFUNC(CreatePropertySet)
|
||||
{
|
||||
(void)pBasic;
|
||||
@ -1518,8 +1503,8 @@ RTLFUNC(CreatePropertySet)
|
||||
RTL_Impl_CreatePropertySet( pBasic, rPar, bWrite );
|
||||
}
|
||||
|
||||
// Abfragen, ob ein Interface unterstuetzt wird
|
||||
// Mehrere Interface-Namen als Parameter
|
||||
|
||||
// multiple interface-names as parameters
|
||||
RTLFUNC(HasUnoInterfaces)
|
||||
{
|
||||
(void)pBasic;
|
||||
@ -1528,7 +1513,7 @@ RTLFUNC(HasUnoInterfaces)
|
||||
RTL_Impl_HasInterfaces( pBasic, rPar, bWrite );
|
||||
}
|
||||
|
||||
// Abfragen, ob ein Basic-Objekt ein Uno-Struct repraesentiert
|
||||
|
||||
RTLFUNC(IsUnoStruct)
|
||||
{
|
||||
(void)pBasic;
|
||||
@ -1537,7 +1522,7 @@ RTLFUNC(IsUnoStruct)
|
||||
RTL_Impl_IsUnoStruct( pBasic, rPar, bWrite );
|
||||
}
|
||||
|
||||
// Abfragen, ob zwei Uno-Objekte identisch sind
|
||||
|
||||
RTLFUNC(EqualUnoObjects)
|
||||
{
|
||||
(void)pBasic;
|
||||
@ -1737,7 +1722,7 @@ RTLFUNC(Split)
|
||||
SbxDimArray* pArray = new SbxDimArray( SbxVARIANT );
|
||||
pArray->unoAddDim( 0, nArraySize-1 );
|
||||
|
||||
// Parameter ins Array uebernehmen
|
||||
// insert parameter(s) into the array
|
||||
for( short i = 0 ; i < nArraySize ; i++ )
|
||||
{
|
||||
SbxVariableRef xVar = new SbxVariable( SbxVARIANT );
|
||||
@ -1745,7 +1730,7 @@ RTLFUNC(Split)
|
||||
pArray->Put( (SbxVariable*)xVar, &i );
|
||||
}
|
||||
|
||||
// Array zurueckliefern
|
||||
// return array
|
||||
SbxVariableRef refVar = rPar.Get(0);
|
||||
sal_uInt16 nFlags = refVar->GetFlags();
|
||||
refVar->ResetFlag( SBX_FIXED );
|
||||
@ -1863,9 +1848,9 @@ sal_Int16 implGetWeekDay( double aDate, bool bFirstDayParam = false, sal_Int16 n
|
||||
if ( aDay != SUNDAY )
|
||||
nDay = (sal_Int16)aDay + 2;
|
||||
else
|
||||
nDay = 1; // 1==Sonntag
|
||||
nDay = 1; // 1 == Sunday
|
||||
|
||||
// #117253 Optional 2. parameter "firstdayofweek"
|
||||
// #117253 optional 2nd parameter "firstdayofweek"
|
||||
if( bFirstDayParam )
|
||||
{
|
||||
if( nFirstDay < 0 || nFirstDay > 7 )
|
||||
|
@ -36,9 +36,9 @@
|
||||
#include "basegfx/numeric/ftools.hxx"
|
||||
|
||||
|
||||
// Properties und Methoden legen beim Get (bWrite = sal_False) den Returnwert
|
||||
// im Element 0 des Argv ab; beim Put (bWrite = sal_True) wird der Wert aus
|
||||
// Element 0 gespeichert.
|
||||
// Properties and methods lay the return value down at Get (bWrite = sal_False)
|
||||
// at the element 0 of the Argv; at Put (bWrite = sal_True) the value from
|
||||
// element 0 is stored.
|
||||
|
||||
RTLFUNC(Erl)
|
||||
{
|
||||
@ -99,7 +99,7 @@ RTLFUNC(Null)
|
||||
(void)pBasic;
|
||||
(void)bWrite;
|
||||
|
||||
// liefert eine leere Objekt-Variable.
|
||||
// returns an empty object-variable
|
||||
rPar.Get( 0 )->PutNull();
|
||||
}
|
||||
|
||||
|
@ -87,7 +87,7 @@ struct SbiArgvStack { // Argv stack:
|
||||
short nArgc; // Argc
|
||||
};
|
||||
|
||||
SbiRuntime::pStep0 SbiRuntime::aStep0[] = { // Alle Opcodes ohne Operanden
|
||||
SbiRuntime::pStep0 SbiRuntime::aStep0[] = { // all opcodes without operands
|
||||
&SbiRuntime::StepNOP,
|
||||
&SbiRuntime::StepEXP,
|
||||
&SbiRuntime::StepMUL,
|
||||
@ -113,41 +113,41 @@ SbiRuntime::pStep0 SbiRuntime::aStep0[] = { // Alle Opcodes ohne Operanden
|
||||
|
||||
&SbiRuntime::StepLIKE,
|
||||
&SbiRuntime::StepIS,
|
||||
// Laden/speichern
|
||||
&SbiRuntime::StepARGC, // neuen Argv einrichten
|
||||
&SbiRuntime::StepARGV, // TOS ==> aktueller Argv
|
||||
// load/save
|
||||
&SbiRuntime::StepARGC, // establish new Argv
|
||||
&SbiRuntime::StepARGV, // TOS ==> current Argv
|
||||
&SbiRuntime::StepINPUT, // Input ==> TOS
|
||||
&SbiRuntime::StepLINPUT, // Line Input ==> TOS
|
||||
&SbiRuntime::StepGET, // TOS anfassen
|
||||
&SbiRuntime::StepSET, // Speichern Objekt TOS ==> TOS-1
|
||||
&SbiRuntime::StepGET, // touch TOS
|
||||
&SbiRuntime::StepSET, // save object TOS ==> TOS-1
|
||||
&SbiRuntime::StepPUT, // TOS ==> TOS-1
|
||||
&SbiRuntime::StepPUTC, // TOS ==> TOS-1, dann ReadOnly
|
||||
&SbiRuntime::StepPUTC, // TOS ==> TOS-1, then ReadOnly
|
||||
&SbiRuntime::StepDIM, // DIM
|
||||
&SbiRuntime::StepREDIM, // REDIM
|
||||
&SbiRuntime::StepREDIMP, // REDIM PRESERVE
|
||||
&SbiRuntime::StepERASE, // TOS loeschen
|
||||
// Verzweigen
|
||||
&SbiRuntime::StepSTOP, // Programmende
|
||||
&SbiRuntime::StepINITFOR, // FOR-Variable initialisieren
|
||||
&SbiRuntime::StepNEXT, // FOR-Variable inkrementieren
|
||||
&SbiRuntime::StepCASE, // Anfang CASE
|
||||
&SbiRuntime::StepENDCASE, // Ende CASE
|
||||
&SbiRuntime::StepSTDERROR, // Standard-Fehlerbehandlung
|
||||
&SbiRuntime::StepNOERROR, // keine Fehlerbehandlung
|
||||
&SbiRuntime::StepLEAVE, // UP verlassen
|
||||
&SbiRuntime::StepERASE, // delete TOS
|
||||
// branch
|
||||
&SbiRuntime::StepSTOP, // program end
|
||||
&SbiRuntime::StepINITFOR, // intitialize FOR-Variable
|
||||
&SbiRuntime::StepNEXT, // increment FOR-Variable
|
||||
&SbiRuntime::StepCASE, // beginning CASE
|
||||
&SbiRuntime::StepENDCASE, // end CASE
|
||||
&SbiRuntime::StepSTDERROR, // standard error handling
|
||||
&SbiRuntime::StepNOERROR, // no error handling
|
||||
&SbiRuntime::StepLEAVE, // leave UP
|
||||
// E/A
|
||||
&SbiRuntime::StepCHANNEL, // TOS = Kanalnummer
|
||||
&SbiRuntime::StepCHANNEL, // TOS = channel number
|
||||
&SbiRuntime::StepPRINT, // print TOS
|
||||
&SbiRuntime::StepPRINTF, // print TOS in field
|
||||
&SbiRuntime::StepWRITE, // write TOS
|
||||
&SbiRuntime::StepRENAME, // Rename Tos+1 to Tos
|
||||
&SbiRuntime::StepPROMPT, // Input Prompt aus TOS definieren
|
||||
&SbiRuntime::StepPROMPT, // define Input Prompt from TOS
|
||||
&SbiRuntime::StepRESTART, // Set restart point
|
||||
&SbiRuntime::StepCHANNEL0, // E/A-Kanal 0 einstellen
|
||||
&SbiRuntime::StepEMPTY, // Leeren Ausdruck auf Stack
|
||||
&SbiRuntime::StepERROR, // TOS = Fehlercode
|
||||
&SbiRuntime::StepLSET, // Speichern Objekt TOS ==> TOS-1
|
||||
&SbiRuntime::StepRSET, // Speichern Objekt TOS ==> TOS-1
|
||||
&SbiRuntime::StepCHANNEL0, // set E/A-channel 0
|
||||
&SbiRuntime::StepEMPTY, // empty expression on stack
|
||||
&SbiRuntime::StepERROR, // TOS = error code
|
||||
&SbiRuntime::StepLSET, // save object TOS ==> TOS-1
|
||||
&SbiRuntime::StepRSET, // save object TOS ==> TOS-1
|
||||
&SbiRuntime::StepREDIMP_ERASE,// Copy array object for REDIMP
|
||||
&SbiRuntime::StepINITFOREACH,// Init for each loop
|
||||
&SbiRuntime::StepVBASET,// vba-like set statement
|
||||
@ -156,60 +156,60 @@ SbiRuntime::pStep0 SbiRuntime::aStep0[] = { // Alle Opcodes ohne Operanden
|
||||
&SbiRuntime::StepBYVAL, // access TOS as array
|
||||
};
|
||||
|
||||
SbiRuntime::pStep1 SbiRuntime::aStep1[] = { // Alle Opcodes mit einem Operanden
|
||||
&SbiRuntime::StepLOADNC, // Laden einer numerischen Konstanten (+ID)
|
||||
&SbiRuntime::StepLOADSC, // Laden einer Stringkonstanten (+ID)
|
||||
SbiRuntime::pStep1 SbiRuntime::aStep1[] = { // all opcodes with one operand
|
||||
&SbiRuntime::StepLOADNC, // loading a numeric constant (+ID)
|
||||
&SbiRuntime::StepLOADSC, // loading a string constant (+ID)
|
||||
&SbiRuntime::StepLOADI, // Immediate Load (+Wert)
|
||||
&SbiRuntime::StepARGN, // Speichern eines named Args in Argv (+StringID)
|
||||
&SbiRuntime::StepPAD, // String auf feste Laenge bringen (+Laenge)
|
||||
// Verzweigungen
|
||||
&SbiRuntime::StepJUMP, // Sprung (+Target)
|
||||
&SbiRuntime::StepJUMPT, // TOS auswerten), bedingter Sprung (+Target)
|
||||
&SbiRuntime::StepJUMPF, // TOS auswerten), bedingter Sprung (+Target)
|
||||
&SbiRuntime::StepONJUMP, // TOS auswerten), Sprung in JUMP-Tabelle (+MaxVal)
|
||||
&SbiRuntime::StepGOSUB, // UP-Aufruf (+Target)
|
||||
&SbiRuntime::StepRETURN, // UP-Return (+0 oder Target)
|
||||
&SbiRuntime::StepTESTFOR, // FOR-Variable testen), inkrementieren (+Endlabel)
|
||||
&SbiRuntime::StepARGN, // save a named Args in Argv (+StringID)
|
||||
&SbiRuntime::StepPAD, // bring string to a definite length (+length)
|
||||
// branches
|
||||
&SbiRuntime::StepJUMP, // jump (+Target)
|
||||
&SbiRuntime::StepJUMPT, // evaluate TOS, conditional jump (+Target)
|
||||
&SbiRuntime::StepJUMPF, // evaluate TOS, conditional jump (+Target)
|
||||
&SbiRuntime::StepONJUMP, // evaluate TOS, jump into JUMP-table (+MaxVal)
|
||||
&SbiRuntime::StepGOSUB, // UP-call (+Target)
|
||||
&SbiRuntime::StepRETURN, // UP-return (+0 or Target)
|
||||
&SbiRuntime::StepTESTFOR, // check FOR-variable, increment (+Endlabel)
|
||||
&SbiRuntime::StepCASETO, // Tos+1 <= Case <= Tos), 2xremove (+Target)
|
||||
&SbiRuntime::StepERRHDL, // Fehler-Handler (+Offset)
|
||||
&SbiRuntime::StepRESUME, // Resume nach Fehlern (+0 or 1 or Label)
|
||||
&SbiRuntime::StepERRHDL, // error handler (+Offset)
|
||||
&SbiRuntime::StepRESUME, // resume after errors (+0 or 1 or Label)
|
||||
// E/A
|
||||
&SbiRuntime::StepCLOSE, // (+Kanal/0)
|
||||
&SbiRuntime::StepCLOSE, // (+channel/0)
|
||||
&SbiRuntime::StepPRCHAR, // (+char)
|
||||
// Verwaltung
|
||||
&SbiRuntime::StepSETCLASS, // Set + Klassennamen testen (+StringId)
|
||||
// management
|
||||
&SbiRuntime::StepSETCLASS, // check set + class names (+StringId)
|
||||
&SbiRuntime::StepTESTCLASS, // Check TOS class (+StringId)
|
||||
&SbiRuntime::StepLIB, // Lib fuer Declare-Call (+StringId)
|
||||
&SbiRuntime::StepBASED, // TOS wird um BASE erhoeht, BASE davor gepusht
|
||||
&SbiRuntime::StepARGTYP, // Letzten Parameter in Argv konvertieren (+Typ)
|
||||
&SbiRuntime::StepLIB, // lib for declare-call (+StringId)
|
||||
&SbiRuntime::StepBASED, // TOS is incremented by BASE, BASE is pushed before
|
||||
&SbiRuntime::StepARGTYP, // convert last parameter in Argv (+Type)
|
||||
&SbiRuntime::StepVBASETCLASS,// vba-like set statement
|
||||
};
|
||||
|
||||
SbiRuntime::pStep2 SbiRuntime::aStep2[] = {// Alle Opcodes mit zwei Operanden
|
||||
&SbiRuntime::StepRTL, // Laden aus RTL (+StringID+Typ)
|
||||
&SbiRuntime::StepFIND, // Laden (+StringID+Typ)
|
||||
&SbiRuntime::StepELEM, // Laden Element (+StringID+Typ)
|
||||
SbiRuntime::pStep2 SbiRuntime::aStep2[] = {// all opcodes with two operands
|
||||
&SbiRuntime::StepRTL, // load from RTL (+StringID+Typ)
|
||||
&SbiRuntime::StepFIND, // load (+StringID+Typ)
|
||||
&SbiRuntime::StepELEM, // load element (+StringID+Typ)
|
||||
&SbiRuntime::StepPARAM, // Parameter (+Offset+Typ)
|
||||
// Verzweigen
|
||||
&SbiRuntime::StepCALL, // Declare-Call (+StringID+Typ)
|
||||
&SbiRuntime::StepCALLC, // CDecl-Declare-Call (+StringID+Typ)
|
||||
&SbiRuntime::StepCASEIS, // Case-Test (+Test-Opcode+False-Target)
|
||||
// Verwaltung
|
||||
&SbiRuntime::StepSTMNT, // Beginn eines Statements (+Line+Col)
|
||||
&SbiRuntime::StepSTMNT, // beginning of a statement (+Line+Col)
|
||||
// E/A
|
||||
&SbiRuntime::StepOPEN, // (+SvStreamFlags+Flags)
|
||||
// Objekte
|
||||
&SbiRuntime::StepLOCAL, // Lokale Variable definieren (+StringId+Typ)
|
||||
&SbiRuntime::StepPUBLIC, // Modulglobale Variable (+StringID+Typ)
|
||||
&SbiRuntime::StepGLOBAL, // Globale Variable definieren (+StringID+Typ)
|
||||
&SbiRuntime::StepCREATE, // Objekt kreieren (+StringId+StringId)
|
||||
&SbiRuntime::StepSTATIC, // Statische Variable (+StringId+StringId)
|
||||
&SbiRuntime::StepTCREATE, // User Defined Objekte (+StringId+StringId)
|
||||
&SbiRuntime::StepDCREATE, // Objekt-Array kreieren (+StringID+StringID)
|
||||
&SbiRuntime::StepGLOBAL_P, // Globale Variable definieren, die beim Neustart
|
||||
// von Basic nicht ueberschrieben wird (+StringID+Typ)
|
||||
&SbiRuntime::StepFIND_G, // Sucht globale Variable mit Spezialbehandlung wegen _GLOBAL_P
|
||||
&SbiRuntime::StepDCREATE_REDIMP, // Objekt-Array redimensionieren (+StringID+StringID)
|
||||
&SbiRuntime::StepLOCAL, // define local variable (+StringId+Typ)
|
||||
&SbiRuntime::StepPUBLIC, // module global variable (+StringID+Typ)
|
||||
&SbiRuntime::StepGLOBAL, // define global variable (+StringID+Typ)
|
||||
&SbiRuntime::StepCREATE, // create object (+StringId+StringId)
|
||||
&SbiRuntime::StepSTATIC, // static variable (+StringId+StringId)
|
||||
&SbiRuntime::StepTCREATE, // user-defined objects (+StringId+StringId)
|
||||
&SbiRuntime::StepDCREATE, // create object-array (+StringID+StringID)
|
||||
&SbiRuntime::StepGLOBAL_P, // define global variable which is not overwritten
|
||||
// by the Basic on a restart (+StringID+Typ)
|
||||
&SbiRuntime::StepFIND_G, // finds global variable with special treatment because of _GLOBAL_P
|
||||
&SbiRuntime::StepDCREATE_REDIMP, // redimension object array (+StringID+StringID)
|
||||
&SbiRuntime::StepFIND_CM, // Search inside a class module (CM) to enable global search in time
|
||||
&SbiRuntime::StepPUBLIC_P, // Search inside a class module (CM) to enable global search in time
|
||||
&SbiRuntime::StepFIND_STATIC, // Search inside a class module (CM) to enable global search in time
|
||||
@ -235,39 +235,38 @@ SbiRTLData::~SbiRTLData()
|
||||
|
||||
// SbiInstance //
|
||||
|
||||
// 16.10.96: #31460 Neues Konzept fuer StepInto/Over/Out
|
||||
// Die Entscheidung, ob StepPoint aufgerufen werden soll, wird anhand des
|
||||
// CallLevels getroffen. Angehalten wird, wenn der aktuelle CallLevel <=
|
||||
// nBreakCallLvl ist. Der aktuelle CallLevel kann niemals kleiner als 1
|
||||
// sein, da er beim Aufruf einer Methode (auch main) inkrementiert wird.
|
||||
// Daher bedeutet ein BreakCallLvl von 0, dass das Programm gar nicht
|
||||
// angehalten wird.
|
||||
// (siehe auch step2.cxx, SbiRuntime::StepSTMNT() )
|
||||
// 16.10.96: #31460 new concept for StepInto/Over/Out
|
||||
// The decision whether StepPoint shall be called is done with the help of
|
||||
// the CallLevel. It's stopped when the current CallLevel is <= nBreakCallLvl.
|
||||
// The current CallLevel can never be smaller than 1, as it's also incremented
|
||||
// during the call of a method (also main). Therefore a BreakCallLvl from 0
|
||||
// means that the program isn't stopped at all.
|
||||
// (also have a look at: step2.cxx, SbiRuntime::StepSTMNT() )
|
||||
|
||||
|
||||
// Hilfsfunktion, um den BreakCallLevel gemaess der der Debug-Flags zu ermitteln
|
||||
void SbiInstance::CalcBreakCallLevel( sal_uInt16 nFlags )
|
||||
{
|
||||
// Break-Flag wegfiltern
|
||||
|
||||
nFlags &= ~((sal_uInt16)SbDEBUG_BREAK);
|
||||
|
||||
sal_uInt16 nRet;
|
||||
switch( nFlags )
|
||||
{
|
||||
case SbDEBUG_STEPINTO:
|
||||
nRet = nCallLvl + 1; // CallLevel+1 wird auch angehalten
|
||||
nRet = nCallLvl + 1; // CallLevel+1 is also stopped
|
||||
break;
|
||||
case SbDEBUG_STEPOVER | SbDEBUG_STEPINTO:
|
||||
nRet = nCallLvl; // Aktueller CallLevel wird angehalten
|
||||
nRet = nCallLvl; // current CallLevel is stopped
|
||||
break;
|
||||
case SbDEBUG_STEPOUT:
|
||||
nRet = nCallLvl - 1; // Kleinerer CallLevel wird angehalten
|
||||
nRet = nCallLvl - 1; // smaller CallLevel is stopped
|
||||
break;
|
||||
case SbDEBUG_CONTINUE:
|
||||
// Basic-IDE liefert 0 statt SbDEBUG_CONTINUE, also auch default=continue
|
||||
// Basic-IDE returns 0 instead of SbDEBUG_CONTINUE, so also default=continue
|
||||
default:
|
||||
nRet = 0; // CallLevel ist immer >0 -> kein StepPoint
|
||||
nRet = 0; // CallLevel is always > 0 -> no StepPoint
|
||||
}
|
||||
nBreakCallLvl = nRet; // Ergebnis uebernehmen
|
||||
nBreakCallLvl = nRet; // take result
|
||||
}
|
||||
|
||||
SbiInstance::SbiInstance( StarBASIC* p )
|
||||
@ -328,7 +327,7 @@ SbiDllMgr* SbiInstance::GetDllMgr()
|
||||
return pDllMgr;
|
||||
}
|
||||
|
||||
// #39629 NumberFormatter jetzt ueber statische Methode anlegen
|
||||
// #39629 create NumberFormatter with the help of a static method now
|
||||
SvNumberFormatter* SbiInstance::GetNumberFormatter()
|
||||
{
|
||||
LanguageType eLangType = GetpApp()->GetSettings().GetLanguage();
|
||||
@ -351,7 +350,7 @@ SvNumberFormatter* SbiInstance::GetNumberFormatter()
|
||||
return pNumberFormatter;
|
||||
}
|
||||
|
||||
// #39629 NumberFormatter auch statisch anbieten
|
||||
// #39629 offer NumberFormatter static too
|
||||
void SbiInstance::PrepareNumberFormatter( SvNumberFormatter*& rpNumberFormatter,
|
||||
sal_uInt32 &rnStdDateIdx, sal_uInt32 &rnStdTimeIdx, sal_uInt32 &rnStdDateTimeIdx,
|
||||
LanguageType* peFormatterLangType, DateFormat* peFormatterDateFormat )
|
||||
@ -379,13 +378,13 @@ void SbiInstance::PrepareNumberFormatter( SvNumberFormatter*& rpNumberFormatter,
|
||||
xub_StrLen nCheckPos = 0; short nType;
|
||||
rnStdTimeIdx = rpNumberFormatter->GetStandardFormat( NUMBERFORMAT_TIME, eLangType );
|
||||
|
||||
// Standard-Vorlagen des Formatters haben nur zweistellige
|
||||
// Jahreszahl. Deshalb eigenes Format registrieren
|
||||
// the formatter's standard templates have only got a two-digit date
|
||||
// -> registering an own format
|
||||
|
||||
// HACK, da der Numberformatter in PutandConvertEntry die Platzhalter
|
||||
// fuer Monat, Tag, Jahr nicht entsprechend der Systemeinstellung
|
||||
// austauscht. Problem: Print Year(Date) unter engl. BS
|
||||
// siehe auch svtools\source\sbx\sbxdate.cxx
|
||||
// HACK, beause the numberformatter doesn't swap the place holders
|
||||
// for month, day and year according to the system setting.
|
||||
// Problem: Print Year(Date) under engl. BS
|
||||
// also have a look at: svtools\source\sbx\sbxdate.cxx
|
||||
|
||||
String aDateStr;
|
||||
switch( eDate )
|
||||
@ -408,7 +407,7 @@ void SbiInstance::PrepareNumberFormatter( SvNumberFormatter*& rpNumberFormatter,
|
||||
|
||||
|
||||
|
||||
// Engine laufenlassen. Falls Flags == SbDEBUG_CONTINUE, Flags uebernehmen
|
||||
// Let engine run. If Flags == SbDEBUG_CONTINUE, take Flags over
|
||||
|
||||
void SbiInstance::Stop()
|
||||
{
|
||||
@ -479,13 +478,12 @@ void SbiInstance::FatalError( SbError _errCode, const String& _details )
|
||||
|
||||
void SbiInstance::Abort()
|
||||
{
|
||||
// Basic suchen, in dem der Fehler auftrat
|
||||
StarBASIC* pErrBasic = GetCurrentBasic( pBasic );
|
||||
pErrBasic->RTError( nErr, aErrorMsg, pRun->nLine, pRun->nCol1, pRun->nCol2 );
|
||||
pBasic->Stop();
|
||||
}
|
||||
|
||||
// Hilfsfunktion, um aktives Basic zu finden, kann ungleich pRTBasic sein
|
||||
// can be unequal to pRTBasic
|
||||
StarBASIC* GetCurrentBasic( StarBASIC* pRTBasic )
|
||||
{
|
||||
StarBASIC* pCurBasic = pRTBasic;
|
||||
@ -531,7 +529,7 @@ SbxArray* SbiInstance::GetLocals( SbMethod* pMeth )
|
||||
|
||||
// SbiInstance //
|
||||
|
||||
// Achtung: pMeth kann auch NULL sein (beim Aufruf des Init-Codes)
|
||||
// Attention: pMeth can also be NULL (on a call of the init-code)
|
||||
|
||||
SbiRuntime::SbiRuntime( SbModule* pm, SbMethod* pe, sal_uInt32 nStart )
|
||||
: rBasic( *(StarBASIC*)pm->pParent ), pInst( pINST ),
|
||||
@ -579,7 +577,7 @@ SbiRuntime::~SbiRuntime()
|
||||
ClearArgvStack();
|
||||
ClearForStack();
|
||||
|
||||
// #74254 Items zum Sichern temporaere Referenzen freigeben
|
||||
// #74254 free items for saving temporary references
|
||||
ClearRefs();
|
||||
while( pItemStoreList )
|
||||
{
|
||||
@ -601,14 +599,14 @@ void SbiRuntime::SetVBAEnabled(bool bEnabled )
|
||||
mpExtCaller = 0;
|
||||
}
|
||||
|
||||
// Aufbau der Parameterliste. Alle ByRef-Parameter werden direkt
|
||||
// uebernommen; von ByVal-Parametern werden Kopien angelegt. Falls
|
||||
// ein bestimmter Datentyp verlangt wird, wird konvertiert.
|
||||
// Construction of the parameter list. All ByRef-parameters are directly
|
||||
// taken over; copies of ByVal-parameters are created. If a particular
|
||||
// data type is requested, it is converted.
|
||||
|
||||
void SbiRuntime::SetParameters( SbxArray* pParams )
|
||||
{
|
||||
refParams = new SbxArray;
|
||||
// fuer den Returnwert
|
||||
// for the return value
|
||||
refParams->Put( pMeth, 0 );
|
||||
|
||||
SbxInfo* pInfo = pMeth ? pMeth->GetInfo() : NULL;
|
||||
@ -642,7 +640,7 @@ void SbiRuntime::SetParameters( SbxArray* pParams )
|
||||
}
|
||||
|
||||
SbxVariable* v = pParams->Get( i );
|
||||
// Methoden sind immer byval!
|
||||
// methods are always byval!
|
||||
sal_Bool bByVal = v->IsA( TYPE(SbxMethod) );
|
||||
SbxDataType t = v->GetType();
|
||||
bool bTargetTypeIsArray = false;
|
||||
@ -670,7 +668,6 @@ void SbiRuntime::SetParameters( SbxArray* pParams )
|
||||
{
|
||||
if( t != SbxVARIANT && t != ( v->GetType() & 0x0FFF ) )
|
||||
{
|
||||
// Array konvertieren??
|
||||
if( p && (p->eType & SbxARRAY) )
|
||||
Error( SbERR_CONVERSION );
|
||||
else
|
||||
@ -701,13 +698,13 @@ void SbiRuntime::SetParameters( SbxArray* pParams )
|
||||
}
|
||||
|
||||
|
||||
// Einen P-Code ausfuehren
|
||||
// execute a P-Code
|
||||
|
||||
sal_Bool SbiRuntime::Step()
|
||||
{
|
||||
if( bRun )
|
||||
{
|
||||
// Unbedingt gelegentlich die Kontrolle abgeben!
|
||||
// in any case check casually!
|
||||
if( !( ++nOps & 0xF ) && pInst->IsReschedule() )
|
||||
{
|
||||
sal_uInt32 nTime = osl_getGlobalTimer();
|
||||
@ -746,19 +743,19 @@ sal_Bool SbiRuntime::Step()
|
||||
else
|
||||
StarBASIC::FatalError( SbERR_INTERNAL_ERROR );
|
||||
|
||||
// SBX-Fehler aufgetreten?
|
||||
SbError nSbError = SbxBase::GetError();
|
||||
Error( ERRCODE_TOERROR(nSbError) ); // Warnings rausfiltern
|
||||
|
||||
// AB 13.2.1997, neues Error-Handling:
|
||||
// ACHTUNG: Hier kann nError auch dann gesetzt sein, wenn !nSbError,
|
||||
// da nError jetzt auch von anderen RT-Instanzen gesetzt werden kann
|
||||
SbError nSbError = SbxBase::GetError();
|
||||
Error( ERRCODE_TOERROR(nSbError) );
|
||||
|
||||
// from 13.2.1997, new error handling:
|
||||
// ATTENTION: nError can be set already even if !nSbError
|
||||
// since nError can now also be set from other RT-instances
|
||||
|
||||
if( nError )
|
||||
SbxBase::ResetError();
|
||||
|
||||
// AB,15.3.96: Fehler nur anzeigen, wenn BASIC noch aktiv
|
||||
// (insbesondere nicht nach Compiler-Fehlern zur Laufzeit)
|
||||
// from 15.3.96: display errors only if BASIC is still active
|
||||
// (especially not after compiler errors at the runtime)
|
||||
if( nError && bRun )
|
||||
{
|
||||
SbError err = nError;
|
||||
@ -773,7 +770,7 @@ sal_Bool SbiRuntime::Step()
|
||||
// to handle the error
|
||||
bool bLetParentHandleThis = false;
|
||||
|
||||
// Im Error Handler? Dann Std-Error
|
||||
// in the error handler? so std-error
|
||||
if ( !bInError )
|
||||
{
|
||||
bInError = sal_True;
|
||||
@ -792,15 +789,14 @@ sal_Bool SbiRuntime::Step()
|
||||
}
|
||||
if ( bLetParentHandleThis )
|
||||
{
|
||||
// AB 13.2.1997, neues Error-Handling:
|
||||
// Uebergeordnete Error-Handler beruecksichtigen
|
||||
// from 13.2.1997, new error handling:
|
||||
// consider superior error handlers
|
||||
|
||||
// Wir haben keinen Error-Handler -> weiter oben suchen
|
||||
// there's no error handler -> find one farther above
|
||||
SbiRuntime* pRtErrHdl = NULL;
|
||||
SbiRuntime* pRt = this;
|
||||
while( NULL != (pRt = pRt->pNext) )
|
||||
{
|
||||
// Gibt es einen Error-Handler?
|
||||
if( pRt->bError == sal_False || pRt->pError != NULL )
|
||||
{
|
||||
pRtErrHdl = pRt;
|
||||
@ -808,37 +804,33 @@ sal_Bool SbiRuntime::Step()
|
||||
}
|
||||
}
|
||||
|
||||
// Error-Hdl gefunden?
|
||||
|
||||
if( pRtErrHdl )
|
||||
{
|
||||
// (Neuen) Error-Stack anlegen
|
||||
SbErrorStack*& rErrStack = GetSbData()->pErrStack;
|
||||
if( rErrStack )
|
||||
delete rErrStack;
|
||||
rErrStack = new SbErrorStack();
|
||||
|
||||
// Alle im Call-Stack darunter stehenden RTs manipulieren
|
||||
// manipulate all the RTs that are below in the call-stack
|
||||
pRt = this;
|
||||
do
|
||||
{
|
||||
// Fehler setzen
|
||||
pRt->nError = err;
|
||||
if( pRt != pRtErrHdl )
|
||||
pRt->bRun = sal_False;
|
||||
|
||||
// In Error-Stack eintragen
|
||||
SbErrorStackEntry *pEntry = new SbErrorStackEntry
|
||||
( pRt->pMeth, pRt->nLine, pRt->nCol1, pRt->nCol2 );
|
||||
rErrStack->C40_INSERT(SbErrorStackEntry, pEntry, rErrStack->Count() );
|
||||
|
||||
// Nach RT mit Error-Handler aufhoeren
|
||||
if( pRt == pRtErrHdl )
|
||||
break;
|
||||
pRt = pRt->pNext;
|
||||
}
|
||||
while( pRt );
|
||||
}
|
||||
// Kein Error-Hdl gefunden -> altes Vorgehen
|
||||
// no error-hdl found -> old behaviour
|
||||
else
|
||||
{
|
||||
pInst->Abort();
|
||||
@ -945,8 +937,8 @@ SbxArray* SbiRuntime::GetParams()
|
||||
|
||||
// Stacks
|
||||
|
||||
// Der Expression-Stack steht fuer die laufende Auswertung von Expressions
|
||||
// zur Verfuegung.
|
||||
// The expression-stack is available for the continous evaluation
|
||||
// of expressions.
|
||||
|
||||
void SbiRuntime::PushVar( SbxVariable* pVar )
|
||||
{
|
||||
@ -968,7 +960,7 @@ SbxVariableRef SbiRuntime::PopVar()
|
||||
if ( xVar->GetName().EqualsAscii( "Cells" ) )
|
||||
OSL_TRACE( "" );
|
||||
#endif
|
||||
// Methods halten im 0.Parameter sich selbst, also weghauen
|
||||
// methods hold themselves in parameter 0
|
||||
if( xVar->IsA( TYPE(SbxMethod) ) )
|
||||
xVar->SetParameters(0);
|
||||
return xVar;
|
||||
@ -976,7 +968,7 @@ SbxVariableRef SbiRuntime::PopVar()
|
||||
|
||||
sal_Bool SbiRuntime::ClearExprStack()
|
||||
{
|
||||
// Achtung: Clear() reicht nicht, da Methods geloescht werden muessen
|
||||
// Attention: Clear() doesn't suffice as methods must be deleted
|
||||
while ( nExprLvl )
|
||||
{
|
||||
PopVar();
|
||||
@ -985,8 +977,8 @@ sal_Bool SbiRuntime::ClearExprStack()
|
||||
return sal_False;
|
||||
}
|
||||
|
||||
// Variable auf dem Expression-Stack holen, ohne sie zu entfernen
|
||||
// n zaehlt ab 0.
|
||||
// Take variable from the expression-stack without removing it
|
||||
// n counts from 0
|
||||
|
||||
SbxVariable* SbiRuntime::GetTOS( short n )
|
||||
{
|
||||
@ -1001,7 +993,6 @@ SbxVariable* SbiRuntime::GetTOS( short n )
|
||||
return refExprStk->Get( (sal_uInt16) n );
|
||||
}
|
||||
|
||||
// Sicherstellen, dass TOS eine temporaere Variable ist
|
||||
|
||||
void SbiRuntime::TOSMakeTemp()
|
||||
{
|
||||
@ -1031,7 +1022,7 @@ void SbiRuntime::TOSMakeTemp()
|
||||
}
|
||||
}
|
||||
|
||||
// Der GOSUB-Stack nimmt Returnadressen fuer GOSUBs auf
|
||||
// the GOSUB-stack collects return-addresses for GOSUBs
|
||||
void SbiRuntime::PushGosub( const sal_uInt8* pc )
|
||||
{
|
||||
if( ++nGosubLvl > MAXRECURSION )
|
||||
@ -1057,7 +1048,6 @@ void SbiRuntime::PopGosub()
|
||||
}
|
||||
}
|
||||
|
||||
// Entleeren des GOSUB-Stacks
|
||||
|
||||
void SbiRuntime::ClearGosubStack()
|
||||
{
|
||||
@ -1067,7 +1057,7 @@ void SbiRuntime::ClearGosubStack()
|
||||
nGosubLvl = 0;
|
||||
}
|
||||
|
||||
// Der Argv-Stack nimmt aktuelle Argument-Vektoren auf
|
||||
// the Argv-stack collects current argument-vectors
|
||||
|
||||
void SbiRuntime::PushArgv()
|
||||
{
|
||||
@ -1092,7 +1082,6 @@ void SbiRuntime::PopArgv()
|
||||
}
|
||||
}
|
||||
|
||||
// Entleeren des Argv-Stacks
|
||||
|
||||
void SbiRuntime::ClearArgvStack()
|
||||
{
|
||||
@ -1100,8 +1089,8 @@ void SbiRuntime::ClearArgvStack()
|
||||
PopArgv();
|
||||
}
|
||||
|
||||
// Push des For-Stacks. Der Stack hat Inkrement, Ende, Beginn und Variable.
|
||||
// Nach Aufbau des Stack-Elements ist der Stack leer.
|
||||
// Push of the for-stack. The stack has increment, end, begin and variable.
|
||||
// After the creation of the stack-element the stack's empty.
|
||||
|
||||
void SbiRuntime::PushFor()
|
||||
{
|
||||
@ -1109,7 +1098,7 @@ void SbiRuntime::PushFor()
|
||||
p->eForType = FOR_TO;
|
||||
p->pNext = pForStk;
|
||||
pForStk = p;
|
||||
// Der Stack ist wie folgt aufgebaut:
|
||||
|
||||
p->refInc = PopVar();
|
||||
p->refEnd = PopVar();
|
||||
SbxVariableRef xBgn = PopVar();
|
||||
@ -1207,7 +1196,6 @@ void SbiRuntime::PushForEach()
|
||||
nForLvl++;
|
||||
}
|
||||
|
||||
// Poppen des FOR-Stacks
|
||||
|
||||
void SbiRuntime::PopFor()
|
||||
{
|
||||
@ -1220,7 +1208,6 @@ void SbiRuntime::PopFor()
|
||||
}
|
||||
}
|
||||
|
||||
// Entleeren des FOR-Stacks
|
||||
|
||||
void SbiRuntime::ClearForStack()
|
||||
{
|
||||
@ -1246,14 +1233,14 @@ SbiForStack* SbiRuntime::FindForStackItemForCollection( class BasicCollection* p
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// DLL-Aufrufe
|
||||
// DLL-calls
|
||||
|
||||
void SbiRuntime::DllCall
|
||||
( const String& aFuncName, // Funktionsname
|
||||
const String& aDLLName, // Name der DLL
|
||||
SbxArray* pArgs, // Parameter (ab Index 1, kann NULL sein)
|
||||
SbxDataType eResType, // Returnwert
|
||||
sal_Bool bCDecl ) // sal_True: nach C-Konventionen
|
||||
( const String& aFuncName,
|
||||
const String& aDLLName,
|
||||
SbxArray* pArgs, // parameter (from index 1, can be NULL)
|
||||
SbxDataType eResType, // return value
|
||||
sal_Bool bCDecl ) // sal_True: according to C-conventions
|
||||
{
|
||||
// No DllCall for "virtual" portal users
|
||||
if( needSecurityRestrictions() )
|
||||
@ -1262,7 +1249,7 @@ void SbiRuntime::DllCall
|
||||
return;
|
||||
}
|
||||
|
||||
// MUSS NOCH IMPLEMENTIERT WERDEN
|
||||
// NOT YET IMPLEMENTED
|
||||
|
||||
SbxVariable* pRes = new SbxVariable( eResType );
|
||||
SbiDllMgr* pDllMgr = pInst->GetDllMgr();
|
||||
|
@ -36,9 +36,9 @@
|
||||
#include "rtlproto.hxx"
|
||||
#include "sbintern.hxx"
|
||||
#include <boost/unordered_map.hpp>
|
||||
// Das nArgs-Feld eines Tabelleneintrags ist wie folgt verschluesselt:
|
||||
// Zur Zeit wird davon ausgegangen, dass Properties keine Parameter
|
||||
// benoetigen!
|
||||
// The nArgs-field of a table entry is encrypted as follows:
|
||||
// At the moment it is assumed that properties don't need any
|
||||
// parameters!
|
||||
|
||||
// previously _ARGSMASK was 0x007F ( e.g. up to 127 args ) however 63 should be
|
||||
// enough, if not we need to increase the size of nArgs member in the Methods
|
||||
@ -52,33 +52,33 @@
|
||||
#define _COMPATONLY 0x0080 // procedure is visible in vba mode only
|
||||
#define _NORMONLY 0x0040 // procedure is visible in normal mode only
|
||||
|
||||
#define _RWMASK 0x0F00 // Maske fuer R/W-Bits
|
||||
#define _TYPEMASK 0xF000 // Maske fuer den Typ des Eintrags
|
||||
#define _RWMASK 0x0F00 // mask for R/W-bits
|
||||
#define _TYPEMASK 0xF000 // mask for the entry's type
|
||||
|
||||
#define _READ 0x0100 // kann gelesen werden
|
||||
#define _BWRITE 0x0200 // kann as Lvalue verwendet werden
|
||||
#define _LVALUE _BWRITE // kann as Lvalue verwendet werden
|
||||
#define _READWRITE 0x0300 // beides
|
||||
#define _OPT 0x0400 // Parameter ist optional
|
||||
#define _CONST 0x0800 // Property ist const
|
||||
#define _METHOD 0x3000 // Masken-Bits fuer eine Methode
|
||||
#define _PROPERTY 0x4000 // Masken-Bit fuer eine Property
|
||||
#define _OBJECT 0x8000 // Masken-Bit fuer ein Objekt
|
||||
// Kombination von oberen Bits:
|
||||
#define _FUNCTION 0x1100 // Maske fuer Function
|
||||
#define _LFUNCTION 0x1300 // Maske fuer Function, die auch als Lvalue geht
|
||||
#define _SUB 0x2100 // Maske fuer Sub
|
||||
#define _ROPROP 0x4100 // Maske Read Only-Property
|
||||
#define _WOPROP 0x4200 // Maske Write Only-Property
|
||||
#define _RWPROP 0x4300 // Maske Read/Write-Property
|
||||
#define _CPROP 0x4900 // Maske fuer Konstante
|
||||
#define _READ 0x0100 // can be read
|
||||
#define _BWRITE 0x0200 // can be used as Lvalue
|
||||
#define _LVALUE _BWRITE // can be used as Lvalue
|
||||
#define _READWRITE 0x0300 // both
|
||||
#define _OPT 0x0400 // parameter is optional
|
||||
#define _CONST 0x0800 // property is const
|
||||
#define _METHOD 0x3000
|
||||
#define _PROPERTY 0x4000
|
||||
#define _OBJECT 0x8000
|
||||
// combination of bits above:
|
||||
#define _FUNCTION 0x1100
|
||||
#define _LFUNCTION 0x1300 // mask for function which also works as Lvalue
|
||||
#define _SUB 0x2100
|
||||
#define _ROPROP 0x4100 // mask Read Only-Property
|
||||
#define _WOPROP 0x4200 // mask Write Only-Property
|
||||
#define _RWPROP 0x4300 // mask Read/Write-Property
|
||||
#define _CPROP 0x4900 // mask for constant
|
||||
|
||||
struct Methods {
|
||||
const char* pName; // Name des Eintrags
|
||||
SbxDataType eType; // Datentyp
|
||||
short nArgs; // Argumente und Flags
|
||||
RtlCall pFunc; // Function Pointer
|
||||
sal_uInt16 nHash; // Hashcode
|
||||
const char* pName;
|
||||
SbxDataType eType;
|
||||
short nArgs;
|
||||
RtlCall pFunc;
|
||||
sal_uInt16 nHash;
|
||||
};
|
||||
|
||||
struct StringHashCode
|
||||
@ -722,11 +722,11 @@ static Methods aMethods[] = {
|
||||
{ "Year", SbxINTEGER, 1 | _FUNCTION, RTLNAME(Year),0 },
|
||||
{ "Date", SbxDATE, 0,NULL,0 },
|
||||
|
||||
{ NULL, SbxNULL, -1,NULL,0 }}; // Tabellenende
|
||||
{ NULL, SbxNULL, -1,NULL,0 }}; // end of the table
|
||||
|
||||
SbiStdObject::SbiStdObject( const String& r, StarBASIC* pb ) : SbxObject( r )
|
||||
{
|
||||
// Muessen wir die Hashcodes initialisieren?
|
||||
// do we have to initialize the hashcodes?
|
||||
Methods* p = aMethods;
|
||||
if( !p->nHash )
|
||||
while( p->nArgs != -1 )
|
||||
@ -754,21 +754,21 @@ SbiStdObject::~SbiStdObject()
|
||||
delete pStdFactory;
|
||||
}
|
||||
|
||||
// Suche nach einem Element:
|
||||
// Hier wird linear durch die Methodentabelle gegangen, bis eine
|
||||
// passende Methode gefunden wurde. Auf Grund der Bits im nArgs-Feld
|
||||
// wird dann die passende Instanz eines SbxObjElement generiert.
|
||||
// Wenn die Methode/Property nicht gefunden wurde, nur NULL ohne
|
||||
// Fehlercode zurueckliefern, da so auch eine ganze Chain von
|
||||
// Objekten nach der Methode/Property befragt werden kann.
|
||||
// Finding an element:
|
||||
// It runs linearly through the method table here until an
|
||||
// adequate method is has been found. Because of the bits in
|
||||
// the nArgs-field the adequate instance of an SbxObjElement
|
||||
// is created then. If the method/property hasn't been found,
|
||||
// return NULL without error code, so that a whole chain of
|
||||
// objects can be asked for the method/property.
|
||||
|
||||
SbxVariable* SbiStdObject::Find( const String& rName, SbxClassType t )
|
||||
{
|
||||
// Bereits eingetragen?
|
||||
// entered already?
|
||||
SbxVariable* pVar = SbxObject::Find( rName, t );
|
||||
if( !pVar )
|
||||
{
|
||||
// sonst suchen
|
||||
// else search one
|
||||
sal_uInt16 nHash_ = SbxVariable::MakeHashCode( rName );
|
||||
Methods* p = aMethods;
|
||||
sal_Bool bFound = sal_False;
|
||||
@ -802,7 +802,7 @@ SbxVariable* SbiStdObject::Find( const String& rName, SbxClassType t )
|
||||
|
||||
if( bFound )
|
||||
{
|
||||
// Args-Felder isolieren:
|
||||
// isolate Args-fields:
|
||||
short nAccess = ( p->nArgs & _RWMASK ) >> 8;
|
||||
short nType = ( p->nArgs & _TYPEMASK );
|
||||
if( p->nArgs & _CONST )
|
||||
@ -821,12 +821,11 @@ SbxVariable* SbiStdObject::Find( const String& rName, SbxClassType t )
|
||||
return pVar;
|
||||
}
|
||||
|
||||
// SetModified mu<EFBFBD> bei der RTL abgklemmt werden
|
||||
// SetModified must be pinched off at the RTL
|
||||
void SbiStdObject::SetModified( sal_Bool )
|
||||
{
|
||||
}
|
||||
|
||||
// Aufruf einer Property oder Methode.
|
||||
|
||||
void SbiStdObject::SFX_NOTIFY( SfxBroadcaster& rBC, const TypeId& rBCType,
|
||||
const SfxHint& rHint, const TypeId& rHintType )
|
||||
@ -866,8 +865,8 @@ void SbiStdObject::SFX_NOTIFY( SfxBroadcaster& rBC, const TypeId& rBCType,
|
||||
}
|
||||
}
|
||||
|
||||
// Zusammenbau der Infostruktur fuer einzelne Elemente
|
||||
// Falls nIdx = 0, nix erzeugen (sind Std-Props!)
|
||||
// building the info-structure for single elements
|
||||
// if nIdx = 0, don't create anything (Std-Props!)
|
||||
|
||||
SbxInfo* SbiStdObject::GetInfo( short nIdx )
|
||||
{
|
||||
|
@ -148,7 +148,7 @@ SbStdPicture::~SbStdPicture()
|
||||
|
||||
SbxVariable* SbStdPicture::Find( const String& rName, SbxClassType t )
|
||||
{
|
||||
// Bereits eingetragen?
|
||||
// entered already?
|
||||
return SbxObject::Find( rName, t );
|
||||
}
|
||||
|
||||
@ -258,7 +258,7 @@ SbStdFont::SbStdFont() :
|
||||
p->SetFlags( SBX_READWRITE | SBX_DONTSTORE );
|
||||
p->SetUserData( ATTR_IMP_SIZE );
|
||||
|
||||
// Name Property selbst verarbeiten
|
||||
// handle name property yourself
|
||||
p = Find( String( RTL_CONSTASCII_USTRINGPARAM("Name") ), SbxCLASS_PROPERTY );
|
||||
DBG_ASSERT( p, "Keine Name Property" );
|
||||
p->SetUserData( ATTR_IMP_NAME );
|
||||
@ -271,7 +271,6 @@ SbStdFont::~SbStdFont()
|
||||
|
||||
SbxVariable* SbStdFont::Find( const String& rName, SbxClassType t )
|
||||
{
|
||||
// Bereits eingetragen?
|
||||
return SbxObject::Find( rName, t );
|
||||
}
|
||||
|
||||
@ -409,12 +408,11 @@ TYPEINIT1( SbStdClipboard, SbxObject );
|
||||
SbStdClipboard::SbStdClipboard() :
|
||||
SbxObject( String( RTL_CONSTASCII_USTRINGPARAM("Clipboard") ) )
|
||||
{
|
||||
// Name Property selbst verarbeiten
|
||||
SbxVariable* p = Find( String( RTL_CONSTASCII_USTRINGPARAM("Name") ), SbxCLASS_PROPERTY );
|
||||
DBG_ASSERT( p, "Keine Name Property" );
|
||||
p->SetUserData( ATTR_IMP_NAME );
|
||||
|
||||
//Methoden registrieren
|
||||
// register methods
|
||||
p = Make( String( RTL_CONSTASCII_USTRINGPARAM("Clear") ), SbxCLASS_METHOD, SbxEMPTY );
|
||||
p->SetFlag( SBX_DONTSTORE );
|
||||
p->SetUserData( METH_CLEAR );
|
||||
@ -442,7 +440,6 @@ SbStdClipboard::~SbStdClipboard()
|
||||
|
||||
SbxVariable* SbStdClipboard::Find( const String& rName, SbxClassType t )
|
||||
{
|
||||
// Bereits eingetragen?
|
||||
return SbxObject::Find( rName, t );
|
||||
}
|
||||
|
||||
|
@ -296,7 +296,7 @@ void SbiRuntime::StepLIKE()
|
||||
PushVar( pRes );
|
||||
}
|
||||
|
||||
// TOS und TOS-1 sind beides Objektvariable und enthalten den selben Pointer
|
||||
// TOS and TOS-1 are both object variables and contain the same pointer
|
||||
|
||||
void SbiRuntime::StepIS()
|
||||
{
|
||||
@ -325,7 +325,7 @@ void SbiRuntime::StepIS()
|
||||
PushVar( pRes );
|
||||
}
|
||||
|
||||
// Aktualisieren des Wertes von TOS
|
||||
// update the value of TOS
|
||||
|
||||
void SbiRuntime::StepGET()
|
||||
{
|
||||
@ -333,7 +333,7 @@ void SbiRuntime::StepGET()
|
||||
p->Broadcast( SBX_HINT_DATAWANTED );
|
||||
}
|
||||
|
||||
// #67607 Uno-Structs kopieren
|
||||
// #67607 copy Uno-Structs
|
||||
inline void checkUnoStructCopy( SbxVariableRef& refVal, SbxVariableRef& refVar )
|
||||
{
|
||||
SbxDataType eVarType = refVar->GetType();
|
||||
@ -359,7 +359,7 @@ inline void checkUnoStructCopy( SbxVariableRef& refVal, SbxVariableRef& refVar )
|
||||
if( aAny.getValueType().getTypeClass() == TypeClass_STRUCT )
|
||||
{
|
||||
SbUnoObject* pNewUnoObj = new SbUnoObject( pUnoObj->GetName(), aAny );
|
||||
// #70324: ClassName uebernehmen
|
||||
// #70324: adopt ClassName
|
||||
pNewUnoObj->SetClassName( pUnoObj->GetClassName() );
|
||||
refVar->PutObject( pNewUnoObj );
|
||||
}
|
||||
@ -368,13 +368,13 @@ inline void checkUnoStructCopy( SbxVariableRef& refVal, SbxVariableRef& refVar )
|
||||
}
|
||||
|
||||
|
||||
// Ablage von TOS in TOS-1
|
||||
// laying down TOS in TOS-1
|
||||
|
||||
void SbiRuntime::StepPUT()
|
||||
{
|
||||
SbxVariableRef refVal = PopVar();
|
||||
SbxVariableRef refVar = PopVar();
|
||||
// Store auf die eigene Methode (innerhalb einer Function)?
|
||||
// store on its own method (inside a function)?
|
||||
sal_Bool bFlagsChanged = sal_False;
|
||||
sal_uInt16 n = 0;
|
||||
if( (SbxVariable*) refVar == (SbxVariable*) pMeth )
|
||||
@ -458,14 +458,14 @@ void removeDimAsNewRecoverItem( SbxVariable* pVar )
|
||||
}
|
||||
|
||||
|
||||
// Speichern Objektvariable
|
||||
// Nicht-Objekt-Variable fuehren zu Fehlern
|
||||
// saving object variable
|
||||
// not-object variables will cause errors
|
||||
|
||||
static const char pCollectionStr[] = "Collection";
|
||||
|
||||
void SbiRuntime::StepSET_Impl( SbxVariableRef& refVal, SbxVariableRef& refVar, bool bHandleDefaultProp )
|
||||
{
|
||||
// #67733 Typen mit Array-Flag sind auch ok
|
||||
// #67733 types with array-flag are OK too
|
||||
|
||||
// Check var, !object is no error for sure if, only if type is fixed
|
||||
SbxDataType eVarType = refVar->GetType();
|
||||
@ -487,13 +487,12 @@ void SbiRuntime::StepSET_Impl( SbxVariableRef& refVal, SbxVariableRef& refVar, b
|
||||
// if they are SbxEMPTY I guess
|
||||
if ( !bHandleDefaultProp || ( bHandleDefaultProp && eValType == SbxOBJECT ) )
|
||||
{
|
||||
// Auf refVal GetObject fuer Collections ausloesen
|
||||
// activate GetOject for collections on refVal
|
||||
SbxBase* pObjVarObj = refVal->GetObject();
|
||||
if( pObjVarObj )
|
||||
{
|
||||
SbxVariableRef refObjVal = PTR_CAST(SbxObject,pObjVarObj);
|
||||
|
||||
// #67733 Typen mit Array-Flag sind auch ok
|
||||
if( refObjVal )
|
||||
refVal = refObjVal;
|
||||
else if( !(eValType & SbxARRAY) )
|
||||
@ -501,16 +500,15 @@ void SbiRuntime::StepSET_Impl( SbxVariableRef& refVal, SbxVariableRef& refVar, b
|
||||
}
|
||||
}
|
||||
|
||||
// #52896 Wenn Uno-Sequences bzw. allgemein Arrays einer als
|
||||
// Object deklarierten Variable zugewiesen werden, kann hier
|
||||
// refVal ungueltig sein!
|
||||
// #52896 refVal can be invalid here, if uno-sequences - or more
|
||||
// general arrays - are assigned to variables that are declared
|
||||
// as an object!
|
||||
if( !refVal )
|
||||
{
|
||||
Error( SbERR_INVALID_USAGE_OBJECT );
|
||||
}
|
||||
else
|
||||
{
|
||||
// Store auf die eigene Methode (innerhalb einer Function)?
|
||||
sal_Bool bFlagsChanged = sal_False;
|
||||
sal_uInt16 n = 0;
|
||||
if( (SbxVariable*) refVar == (SbxVariable*) pMeth )
|
||||
@ -666,7 +664,7 @@ void SbiRuntime::StepSET_Impl( SbxVariableRef& refVal, SbxVariableRef& refVar, b
|
||||
// in this case we do not want to call checkUnoStructCopy 'cause that will
|
||||
// cause an error also
|
||||
if ( !bHandleDefaultProp || ( bHandleDefaultProp && ( refVar->GetType() != SbxEMPTY ) ) )
|
||||
// #67607 Uno-Structs kopieren
|
||||
// #67607 copy Uno-Structs
|
||||
checkUnoStructCopy( refVal, refVar );
|
||||
if( bFlagsChanged )
|
||||
refVar->SetFlags( n );
|
||||
@ -698,7 +696,6 @@ void SbiRuntime::StepLSET()
|
||||
Error( SbERR_INVALID_USAGE_OBJECT );
|
||||
else
|
||||
{
|
||||
// Store auf die eigene Methode (innerhalb einer Function)?
|
||||
sal_uInt16 n = refVar->GetFlags();
|
||||
if( (SbxVariable*) refVar == (SbxVariable*) pMeth )
|
||||
refVar->SetFlag( SBX_WRITE );
|
||||
@ -733,7 +730,6 @@ void SbiRuntime::StepRSET()
|
||||
Error( SbERR_INVALID_USAGE_OBJECT );
|
||||
else
|
||||
{
|
||||
// Store auf die eigene Methode (innerhalb einer Function)?
|
||||
sal_uInt16 n = refVar->GetFlags();
|
||||
if( (SbxVariable*) refVar == (SbxVariable*) pMeth )
|
||||
refVar->SetFlag( SBX_WRITE );
|
||||
@ -755,7 +751,7 @@ void SbiRuntime::StepRSET()
|
||||
}
|
||||
}
|
||||
|
||||
// Ablage von TOS in TOS-1, dann ReadOnly-Bit setzen
|
||||
// laying down TOS in TOS-1, then set ReadOnly-Bit
|
||||
|
||||
void SbiRuntime::StepPUTC()
|
||||
{
|
||||
@ -768,7 +764,7 @@ void SbiRuntime::StepPUTC()
|
||||
}
|
||||
|
||||
// DIM
|
||||
// TOS = Variable fuer das Array mit Dimensionsangaben als Parameter
|
||||
// TOS = variable for the array with dimension information as parameter
|
||||
|
||||
void SbiRuntime::StepDIM()
|
||||
{
|
||||
@ -776,7 +772,7 @@ void SbiRuntime::StepDIM()
|
||||
DimImpl( refVar );
|
||||
}
|
||||
|
||||
// #56204 DIM-Funktionalitaet in Hilfsmethode auslagern (step0.cxx)
|
||||
// #56204 swap out DIM-functionality into a help method (step0.cxx)
|
||||
void SbiRuntime::DimImpl( SbxVariableRef refVar )
|
||||
{
|
||||
// If refDim then this DIM statement is terminating a ReDIM and
|
||||
@ -791,15 +787,15 @@ void SbiRuntime::DimImpl( SbxVariableRef refVar )
|
||||
refRedim = NULL;
|
||||
}
|
||||
SbxArray* pDims = refVar->GetParameters();
|
||||
// Muss eine gerade Anzahl Argumente haben
|
||||
// Man denke daran, dass Arg[0] nicht zaehlt!
|
||||
// must have an even number of arguments
|
||||
// have in mind that Arg[0] does not count!
|
||||
if( pDims && !( pDims->Count() & 1 ) )
|
||||
StarBASIC::FatalError( SbERR_INTERNAL_ERROR );
|
||||
else
|
||||
{
|
||||
SbxDataType eType = refVar->IsFixed() ? refVar->GetType() : SbxVARIANT;
|
||||
SbxDimArray* pArray = new SbxDimArray( eType );
|
||||
// auch Arrays ohne Dimensionsangaben zulassen (VB-komp.)
|
||||
// allow arrays without dimension information, too (VB-compatible)
|
||||
if( pDims )
|
||||
{
|
||||
refVar->ResetFlag( SBX_VAR_TO_DIM );
|
||||
@ -817,8 +813,8 @@ void SbiRuntime::DimImpl( SbxVariableRef refVar )
|
||||
}
|
||||
else
|
||||
{
|
||||
// #62867 Beim Anlegen eines Arrays der Laenge 0 wie bei
|
||||
// Uno-Sequences der Laenge 0 eine Dimension anlegen
|
||||
// #62867 On creating an array of the length 0, create
|
||||
// a dimension (like for Uno-Sequences of the length 0)
|
||||
pArray->unoAddDim( 0, -1 );
|
||||
}
|
||||
sal_uInt16 nSavFlags = refVar->GetFlags();
|
||||
@ -830,13 +826,13 @@ void SbiRuntime::DimImpl( SbxVariableRef refVar )
|
||||
}
|
||||
|
||||
// REDIM
|
||||
// TOS = Variable fuer das Array
|
||||
// argv = Dimensionsangaben
|
||||
// TOS = variable for the array
|
||||
// argv = dimension information
|
||||
|
||||
void SbiRuntime::StepREDIM()
|
||||
{
|
||||
// Im Moment ist es nichts anderes als Dim, da doppeltes Dim
|
||||
// bereits vom Compiler erkannt wird.
|
||||
// Nothing different than dim at the moment because
|
||||
// a double dim is already recognized by the compiler.
|
||||
StepDIM();
|
||||
}
|
||||
|
||||
@ -864,8 +860,8 @@ void implCopyDimArray( SbxDimArray* pNewArray, SbxDimArray* pOldArray, short nMa
|
||||
}
|
||||
|
||||
// REDIM PRESERVE
|
||||
// TOS = Variable fuer das Array
|
||||
// argv = Dimensionsangaben
|
||||
// TOS = variable for the array
|
||||
// argv = dimension information
|
||||
|
||||
void SbiRuntime::StepREDIMP()
|
||||
{
|
||||
@ -997,11 +993,11 @@ void lcl_eraseImpl( SbxVariableRef& refVar, bool bVBAEnabled )
|
||||
}
|
||||
}
|
||||
else
|
||||
// Arrays haben bei Erase nach VB ein recht komplexes Verhalten. Hier
|
||||
// werden zunaechst nur die Typ-Probleme bei REDIM (#26295) beseitigt:
|
||||
// Typ hart auf den Array-Typ setzen, da eine Variable mit Array
|
||||
// SbxOBJECT ist. Bei REDIM entsteht dann ein SbxOBJECT-Array und
|
||||
// der ursruengliche Typ geht verloren -> Laufzeitfehler
|
||||
// Arrays have on an erase to VB quite a complex behaviour. Here are
|
||||
// only the type problems at REDIM (#26295) removed at first:
|
||||
// Set type hard onto the array-type, because a variable with array is
|
||||
// SbxOBJECT. At REDIM there's an SbxOBJECT-array generated then and
|
||||
// the original type is lost -> runtime error
|
||||
lcl_clearImpl( refVar, eType );
|
||||
}
|
||||
else
|
||||
@ -1011,8 +1007,8 @@ void lcl_eraseImpl( SbxVariableRef& refVar, bool bVBAEnabled )
|
||||
refVar->SetType( SbxEMPTY );
|
||||
}
|
||||
|
||||
// Variable loeschen
|
||||
// TOS = Variable
|
||||
// delete variable
|
||||
// TOS = variable
|
||||
|
||||
void SbiRuntime::StepERASE()
|
||||
{
|
||||
@ -1048,8 +1044,8 @@ void SbiRuntime::StepBYVAL()
|
||||
PushVar( pCopyVar );
|
||||
}
|
||||
|
||||
// Einrichten eines Argvs
|
||||
// nOp1 bleibt so -> 1. Element ist Returnwert
|
||||
// establishing an argv
|
||||
// nOp1 stays as it is -> 1st element is the return value
|
||||
|
||||
void SbiRuntime::StepARGC()
|
||||
{
|
||||
@ -1058,7 +1054,7 @@ void SbiRuntime::StepARGC()
|
||||
nArgc = 1;
|
||||
}
|
||||
|
||||
// Speichern eines Arguments in Argv
|
||||
// storing an argument in Argv
|
||||
|
||||
void SbiRuntime::StepARGV()
|
||||
{
|
||||
@ -1071,7 +1067,7 @@ void SbiRuntime::StepARGV()
|
||||
// Before fix of #94916:
|
||||
if( pVal->ISA(SbxMethod) || pVal->ISA(SbUnoProperty) || pVal->ISA(SbProcedureProperty) )
|
||||
{
|
||||
// Methoden und Properties evaluieren!
|
||||
// evaluate methods and properties!
|
||||
SbxVariable* pRes = new SbxVariable( *pVal );
|
||||
pVal = pRes;
|
||||
}
|
||||
@ -1079,8 +1075,8 @@ void SbiRuntime::StepARGV()
|
||||
}
|
||||
}
|
||||
|
||||
// Input to Variable. Die Variable ist auf TOS und wird
|
||||
// anschliessend entfernt.
|
||||
// Input to Variable. The variable is on TOS and is
|
||||
// is removed afterwards.
|
||||
|
||||
void SbiRuntime::StepINPUT()
|
||||
{
|
||||
@ -1124,8 +1120,8 @@ void SbiRuntime::StepINPUT()
|
||||
if( !err )
|
||||
{
|
||||
SbxVariableRef pVar = GetTOS();
|
||||
// Zuerst versuchen, die Variable mit einem numerischen Wert
|
||||
// zu fuellen, dann mit einem Stringwert
|
||||
// try to fill the variable with a numeric value first,
|
||||
// then with a string value
|
||||
if( !pVar->IsFixed() || pVar->IsNumeric() )
|
||||
{
|
||||
sal_uInt16 nLen = 0;
|
||||
@ -1134,7 +1130,7 @@ void SbiRuntime::StepINPUT()
|
||||
err = SbxBase::GetError();
|
||||
SbxBase::ResetError();
|
||||
}
|
||||
// Der Wert muss komplett eingescant werden
|
||||
// the value has to be scanned in completely
|
||||
else if( nLen != s.Len() && !pVar->PutString( s ) )
|
||||
{
|
||||
err = SbxBase::GetError();
|
||||
@ -1176,8 +1172,8 @@ void SbiRuntime::StepINPUT()
|
||||
}
|
||||
}
|
||||
|
||||
// Line Input to Variable. Die Variable ist auf TOS und wird
|
||||
// anschliessend entfernt.
|
||||
// Line Input to Variable. The variable is on TOS and is
|
||||
// deleted afterwards.
|
||||
|
||||
void SbiRuntime::StepLINPUT()
|
||||
{
|
||||
@ -1188,14 +1184,13 @@ void SbiRuntime::StepLINPUT()
|
||||
p->PutString( String( aInput, gsl_getSystemTextEncoding() ) );
|
||||
}
|
||||
|
||||
// Programmende
|
||||
// end of program
|
||||
|
||||
void SbiRuntime::StepSTOP()
|
||||
{
|
||||
pInst->Stop();
|
||||
}
|
||||
|
||||
// FOR-Variable initialisieren
|
||||
|
||||
void SbiRuntime::StepINITFOR()
|
||||
{
|
||||
@ -1207,7 +1202,7 @@ void SbiRuntime::StepINITFOREACH()
|
||||
PushForEach();
|
||||
}
|
||||
|
||||
// FOR-Variable inkrementieren
|
||||
// increment FOR-variable
|
||||
|
||||
void SbiRuntime::StepNEXT()
|
||||
{
|
||||
@ -1220,7 +1215,7 @@ void SbiRuntime::StepNEXT()
|
||||
pForStk->refVar->Compute( SbxPLUS, *pForStk->refInc );
|
||||
}
|
||||
|
||||
// Anfang CASE: TOS in CASE-Stack
|
||||
// beginning CASE: TOS in CASE-stack
|
||||
|
||||
void SbiRuntime::StepCASE()
|
||||
{
|
||||
@ -1230,7 +1225,7 @@ void SbiRuntime::StepCASE()
|
||||
refCaseStk->Put( xVar, refCaseStk->Count() );
|
||||
}
|
||||
|
||||
// Ende CASE: Variable freigeben
|
||||
// end CASE: free variable
|
||||
|
||||
void SbiRuntime::StepENDCASE()
|
||||
{
|
||||
@ -1240,7 +1235,6 @@ void SbiRuntime::StepENDCASE()
|
||||
refCaseStk->Remove( refCaseStk->Count() - 1 );
|
||||
}
|
||||
|
||||
// Standard-Fehlerbehandlung
|
||||
|
||||
void SbiRuntime::StepSTDERROR()
|
||||
{
|
||||
@ -1262,7 +1256,7 @@ void SbiRuntime::StepNOERROR()
|
||||
bError = sal_False;
|
||||
}
|
||||
|
||||
// UP verlassen
|
||||
// leave UP
|
||||
|
||||
void SbiRuntime::StepLEAVE()
|
||||
{
|
||||
@ -1272,7 +1266,7 @@ void SbiRuntime::StepLEAVE()
|
||||
SbxErrObject::getUnoErrObject()->Clear();
|
||||
}
|
||||
|
||||
void SbiRuntime::StepCHANNEL() // TOS = Kanalnummer
|
||||
void SbiRuntime::StepCHANNEL() // TOS = channel number
|
||||
{
|
||||
SbxVariableRef pChan = PopVar();
|
||||
short nChan = pChan->GetInteger();
|
||||
@ -1291,7 +1285,7 @@ void SbiRuntime::StepPRINT() // print TOS
|
||||
String s1 = p->GetString();
|
||||
String s;
|
||||
if( p->GetType() >= SbxINTEGER && p->GetType() <= SbxDOUBLE )
|
||||
s = ' '; // ein Blank davor
|
||||
s = ' '; // one blank before
|
||||
s += s1;
|
||||
ByteString aByteStr( s, gsl_getSystemTextEncoding() );
|
||||
pIosys->Write( aByteStr );
|
||||
@ -1304,7 +1298,7 @@ void SbiRuntime::StepPRINTF() // print TOS in field
|
||||
String s1 = p->GetString();
|
||||
String s;
|
||||
if( p->GetType() >= SbxINTEGER && p->GetType() <= SbxDOUBLE )
|
||||
s = ' '; // ein Blank davor
|
||||
s = ' ';
|
||||
s += s1;
|
||||
s.Expand( 14, ' ' );
|
||||
ByteString aByteStr( s, gsl_getSystemTextEncoding() );
|
||||
@ -1315,7 +1309,7 @@ void SbiRuntime::StepPRINTF() // print TOS in field
|
||||
void SbiRuntime::StepWRITE() // write TOS
|
||||
{
|
||||
SbxVariableRef p = PopVar();
|
||||
// Muss der String gekapselt werden?
|
||||
// Does the string have to be encapsulated?
|
||||
char ch = 0;
|
||||
switch (p->GetType() )
|
||||
{
|
||||
@ -1369,20 +1363,20 @@ void SbiRuntime::StepRESTART()
|
||||
pRestart = pCode;
|
||||
}
|
||||
|
||||
// Leerer Ausdruck auf Stack fuer fehlenden Parameter
|
||||
// empty expression on stack for missing parameter
|
||||
|
||||
void SbiRuntime::StepEMPTY()
|
||||
{
|
||||
// #57915 Die Semantik von StepEMPTY() ist die Repraesentation eines fehlenden
|
||||
// Arguments. Dies wird in VB durch ein durch den Wert 448 (SbERR_NAMED_NOT_FOUND)
|
||||
// vom Typ Error repraesentiert. StepEmpty jetzt muesste besser StepMISSING()
|
||||
// heissen, aber der Name wird der Einfachkeit halber beibehalten.
|
||||
// #57915 The semantics of StepEMPTY() is the representation of a missing argument.
|
||||
// This is represented by the value 448 (SbERR_NAMED_NOT_FOUND) of the type error
|
||||
// in VB. StepEmpty should now rather be named StepMISSING() but the name is kept
|
||||
// to simplify matters.
|
||||
SbxVariableRef xVar = new SbxVariable( SbxVARIANT );
|
||||
xVar->PutErr( 448 );
|
||||
PushVar( xVar );
|
||||
}
|
||||
|
||||
// TOS = Fehlercode
|
||||
// TOS = error code
|
||||
|
||||
void SbiRuntime::StepERROR()
|
||||
{
|
||||
|
@ -41,15 +41,15 @@
|
||||
|
||||
bool checkUnoObjectType( SbUnoObject* refVal, const ::rtl::OUString& aClass );
|
||||
|
||||
// Laden einer numerischen Konstanten (+ID)
|
||||
// loading a numeric constant (+ID)
|
||||
|
||||
void SbiRuntime::StepLOADNC( sal_uInt32 nOp1 )
|
||||
{
|
||||
SbxVariable* p = new SbxVariable( SbxDOUBLE );
|
||||
|
||||
// #57844 Lokalisierte Funktion benutzen
|
||||
// #57844 use localized function
|
||||
String aStr = pImg->GetString( static_cast<short>( nOp1 ) );
|
||||
// Auch , zulassen !!!
|
||||
// also allow , !!!
|
||||
sal_uInt16 iComma = aStr.Search( ',' );
|
||||
if( iComma != STRING_NOTFOUND )
|
||||
{
|
||||
@ -65,7 +65,7 @@ void SbiRuntime::StepLOADNC( sal_uInt32 nOp1 )
|
||||
PushVar( p );
|
||||
}
|
||||
|
||||
// Laden einer Stringkonstanten (+ID)
|
||||
// loading a string constant (+ID)
|
||||
|
||||
void SbiRuntime::StepLOADSC( sal_uInt32 nOp1 )
|
||||
{
|
||||
@ -83,7 +83,7 @@ void SbiRuntime::StepLOADI( sal_uInt32 nOp1 )
|
||||
PushVar( p );
|
||||
}
|
||||
|
||||
// Speichern eines named Arguments in Argv (+Arg-Nr ab 1!)
|
||||
// stora a named argument in Argv (+Arg-no. from 1!)
|
||||
|
||||
void SbiRuntime::StepARGN( sal_uInt32 nOp1 )
|
||||
{
|
||||
@ -98,7 +98,7 @@ void SbiRuntime::StepARGN( sal_uInt32 nOp1 )
|
||||
// named variables ( that are Any especially properties ) can be empty at this point and need a broadcast
|
||||
if ( pVal->GetType() == SbxEMPTY )
|
||||
pVal->Broadcast( SBX_HINT_DATAWANTED );
|
||||
// Methoden und Properties evaluieren!
|
||||
// evaluate methods and properties!
|
||||
SbxVariable* pRes = new SbxVariable( *pVal );
|
||||
pVal = pRes;
|
||||
}
|
||||
@ -107,7 +107,7 @@ void SbiRuntime::StepARGN( sal_uInt32 nOp1 )
|
||||
}
|
||||
}
|
||||
|
||||
// Konvertierung des Typs eines Arguments in Argv fuer DECLARE-Fkt. (+Typ)
|
||||
// converting the type of an argument in Argv for DECLARE-Fkt. (+type)
|
||||
|
||||
void SbiRuntime::StepARGTYP( sal_uInt32 nOp1 )
|
||||
{
|
||||
@ -115,44 +115,44 @@ void SbiRuntime::StepARGTYP( sal_uInt32 nOp1 )
|
||||
StarBASIC::FatalError( SbERR_INTERNAL_ERROR );
|
||||
else
|
||||
{
|
||||
sal_Bool bByVal = (nOp1 & 0x8000) != 0; // Ist BYVAL verlangt?
|
||||
sal_Bool bByVal = (nOp1 & 0x8000) != 0; // Ist BYVAL requested?
|
||||
SbxDataType t = (SbxDataType) (nOp1 & 0x7FFF);
|
||||
SbxVariable* pVar = refArgv->Get( refArgv->Count() - 1 ); // letztes Arg
|
||||
SbxVariable* pVar = refArgv->Get( refArgv->Count() - 1 ); // last Arg
|
||||
|
||||
// BYVAL pr<70>fen
|
||||
if( pVar->GetRefCount() > 2 ) // 2 ist normal f<>r BYVAL
|
||||
// check BYVAL
|
||||
if( pVar->GetRefCount() > 2 ) // 2 is normal for BYVAL
|
||||
{
|
||||
// Parameter ist eine Referenz
|
||||
// parameter is a reference
|
||||
if( bByVal )
|
||||
{
|
||||
// Call by Value ist verlangt -> Kopie anlegen
|
||||
// Call by Value is requested -> create a copy
|
||||
pVar = new SbxVariable( *pVar );
|
||||
pVar->SetFlag( SBX_READWRITE );
|
||||
refExprStk->Put( pVar, refArgv->Count() - 1 );
|
||||
}
|
||||
else
|
||||
pVar->SetFlag( SBX_REFERENCE ); // Ref-Flag f<EFBFBD>r DllMgr
|
||||
pVar->SetFlag( SBX_REFERENCE ); // Ref-Flag for DllMgr
|
||||
}
|
||||
else
|
||||
{
|
||||
// Parameter ist KEINE Referenz
|
||||
// parameter is NO reference
|
||||
if( bByVal )
|
||||
pVar->ResetFlag( SBX_REFERENCE ); // Keine Referenz -> OK
|
||||
pVar->ResetFlag( SBX_REFERENCE ); // no reference -> OK
|
||||
else
|
||||
Error( SbERR_BAD_PARAMETERS ); // Referenz verlangt
|
||||
Error( SbERR_BAD_PARAMETERS ); // reference needed
|
||||
}
|
||||
|
||||
if( pVar->GetType() != t )
|
||||
{
|
||||
// Variant, damit richtige Konvertierung
|
||||
// Ausserdem Fehler, wenn SbxBYREF
|
||||
// variant for correct conversion
|
||||
// besides error, if SbxBYREF
|
||||
pVar->Convert( SbxVARIANT );
|
||||
pVar->Convert( t );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// String auf feste Laenge bringen (+Laenge)
|
||||
// bring string to a definite length (+length)
|
||||
|
||||
void SbiRuntime::StepPAD( sal_uInt32 nOp1 )
|
||||
{
|
||||
@ -164,7 +164,7 @@ void SbiRuntime::StepPAD( sal_uInt32 nOp1 )
|
||||
s.Expand( static_cast<xub_StrLen>( nOp1 ), ' ' );
|
||||
}
|
||||
|
||||
// Sprung (+Target)
|
||||
// jump (+target)
|
||||
|
||||
void SbiRuntime::StepJUMP( sal_uInt32 nOp1 )
|
||||
{
|
||||
@ -177,7 +177,7 @@ void SbiRuntime::StepJUMP( sal_uInt32 nOp1 )
|
||||
pCode = (const sal_uInt8*) pImg->GetCode() + nOp1;
|
||||
}
|
||||
|
||||
// TOS auswerten, bedingter Sprung (+Target)
|
||||
// evaluate TOS, conditional jump (+target)
|
||||
|
||||
void SbiRuntime::StepJUMPT( sal_uInt32 nOp1 )
|
||||
{
|
||||
@ -186,7 +186,7 @@ void SbiRuntime::StepJUMPT( sal_uInt32 nOp1 )
|
||||
StepJUMP( nOp1 );
|
||||
}
|
||||
|
||||
// TOS auswerten, bedingter Sprung (+Target)
|
||||
// evaluate TOS, conditional jump (+target)
|
||||
|
||||
void SbiRuntime::StepJUMPF( sal_uInt32 nOp1 )
|
||||
{
|
||||
@ -197,13 +197,13 @@ void SbiRuntime::StepJUMPF( sal_uInt32 nOp1 )
|
||||
StepJUMP( nOp1 );
|
||||
}
|
||||
|
||||
// TOS auswerten, Sprung in JUMP-Tabelle (+MaxVal)
|
||||
// Sieht so aus:
|
||||
// evaluate TOS, jump into JUMP-table (+MaxVal)
|
||||
// looks like this:
|
||||
// ONJUMP 2
|
||||
// JUMP target1
|
||||
// JUMP target2
|
||||
// ...
|
||||
//Falls im Operanden 0x8000 gesetzt ist, Returnadresse pushen (ON..GOSUB)
|
||||
// if 0x8000 is set in the operand, push the return address (ON..GOSUB)
|
||||
|
||||
void SbiRuntime::StepONJUMP( sal_uInt32 nOp1 )
|
||||
{
|
||||
@ -220,7 +220,7 @@ void SbiRuntime::StepONJUMP( sal_uInt32 nOp1 )
|
||||
StepJUMP( nOp1 );
|
||||
}
|
||||
|
||||
// UP-Aufruf (+Target)
|
||||
// UP-call (+target)
|
||||
|
||||
void SbiRuntime::StepGOSUB( sal_uInt32 nOp1 )
|
||||
{
|
||||
@ -230,7 +230,7 @@ void SbiRuntime::StepGOSUB( sal_uInt32 nOp1 )
|
||||
pCode = (const sal_uInt8*) pImg->GetCode() + nOp1;
|
||||
}
|
||||
|
||||
// UP-Return (+0 oder Target)
|
||||
// UP-return (+0 or target)
|
||||
|
||||
void SbiRuntime::StepRETURN( sal_uInt32 nOp1 )
|
||||
{
|
||||
@ -239,7 +239,7 @@ void SbiRuntime::StepRETURN( sal_uInt32 nOp1 )
|
||||
StepJUMP( nOp1 );
|
||||
}
|
||||
|
||||
// FOR-Variable testen (+Endlabel)
|
||||
// check FOR-variable (+Endlabel)
|
||||
|
||||
void SbiRuntime::StepTESTFOR( sal_uInt32 nOp1 )
|
||||
{
|
||||
@ -357,7 +357,6 @@ void SbiRuntime::StepCASETO( sal_uInt32 nOp1 )
|
||||
}
|
||||
}
|
||||
|
||||
// Fehler-Handler
|
||||
|
||||
void SbiRuntime::StepERRHDL( sal_uInt32 nOp1 )
|
||||
{
|
||||
@ -372,11 +371,11 @@ void SbiRuntime::StepERRHDL( sal_uInt32 nOp1 )
|
||||
SbxErrObject::getUnoErrObject()->Clear();
|
||||
}
|
||||
|
||||
// Resume nach Fehlern (+0=statement, 1=next or Label)
|
||||
// Resume after errors (+0=statement, 1=next or Label)
|
||||
|
||||
void SbiRuntime::StepRESUME( sal_uInt32 nOp1 )
|
||||
{
|
||||
// #32714 Resume ohne Error? -> Fehler
|
||||
// #32714 Resume without error? -> error
|
||||
if( !bInError )
|
||||
{
|
||||
Error( SbERR_BAD_RESUME );
|
||||
@ -384,7 +383,7 @@ void SbiRuntime::StepRESUME( sal_uInt32 nOp1 )
|
||||
}
|
||||
if( nOp1 )
|
||||
{
|
||||
// Code-Zeiger auf naechstes Statement setzen
|
||||
// set Code-pointer to the next statement
|
||||
sal_uInt16 n1, n2;
|
||||
pCode = pMod->FindNextStmnt( pErrCode, n1, n2, sal_True, pImg );
|
||||
}
|
||||
@ -401,13 +400,13 @@ void SbiRuntime::StepRESUME( sal_uInt32 nOp1 )
|
||||
nError = 0;
|
||||
bInError = sal_False;
|
||||
|
||||
// Error-Stack loeschen
|
||||
|
||||
SbErrorStack*& rErrStack = GetSbData()->pErrStack;
|
||||
delete rErrStack;
|
||||
rErrStack = NULL;
|
||||
}
|
||||
|
||||
// Kanal schliessen (+Kanal, 0=Alle)
|
||||
// close channel (+channel, 0=all)
|
||||
void SbiRuntime::StepCLOSE( sal_uInt32 nOp1 )
|
||||
{
|
||||
SbError err;
|
||||
@ -425,7 +424,7 @@ void SbiRuntime::StepCLOSE( sal_uInt32 nOp1 )
|
||||
Error( err );
|
||||
}
|
||||
|
||||
// Zeichen ausgeben (+char)
|
||||
// output character (+char)
|
||||
|
||||
void SbiRuntime::StepPRCHAR( sal_uInt32 nOp1 )
|
||||
{
|
||||
@ -434,7 +433,7 @@ void SbiRuntime::StepPRCHAR( sal_uInt32 nOp1 )
|
||||
Error( pIosys->GetError() );
|
||||
}
|
||||
|
||||
// Check, ob TOS eine bestimmte Objektklasse ist (+StringID)
|
||||
// check whether TOS is a certain object class (+StringID)
|
||||
|
||||
bool SbiRuntime::implIsClass( SbxObject* pObj, const ::rtl::OUString& aClass )
|
||||
{
|
||||
@ -551,16 +550,16 @@ void SbiRuntime::StepTESTCLASS( sal_uInt32 nOp1 )
|
||||
PushVar( pRet );
|
||||
}
|
||||
|
||||
// Library fuer anschliessenden Declare-Call definieren
|
||||
// define library for following declare-call
|
||||
|
||||
void SbiRuntime::StepLIB( sal_uInt32 nOp1 )
|
||||
{
|
||||
aLibName = pImg->GetString( static_cast<short>( nOp1 ) );
|
||||
}
|
||||
|
||||
// TOS wird um BASE erhoeht, BASE davor gepusht (+BASE)
|
||||
// Dieser Opcode wird vor DIM/REDIM-Anweisungen gepusht,
|
||||
// wenn nur ein Index angegeben wurde.
|
||||
// TOS is incremented by BASE, BASE is pushed before (+BASE)
|
||||
// This opcode is pushed before DIM/REDIM-commands,
|
||||
// if there's been only one index named.
|
||||
|
||||
void SbiRuntime::StepBASED( sal_uInt32 nOp1 )
|
||||
{
|
||||
@ -573,8 +572,8 @@ void SbiRuntime::StepBASED( sal_uInt32 nOp1 )
|
||||
p1->PutInteger( uBase );
|
||||
if( !bCompatible )
|
||||
x2->Compute( SbxPLUS, *p1 );
|
||||
PushVar( x2 ); // erst die Expr
|
||||
PushVar( p1 ); // dann die Base
|
||||
PushVar( x2 ); // first the Expr
|
||||
PushVar( p1 ); // then the Base
|
||||
}
|
||||
|
||||
|
||||
|
@ -52,9 +52,9 @@ using com::sun::star::uno::Reference;
|
||||
|
||||
SbxVariable* getVBAConstant( const String& rName );
|
||||
|
||||
// Suchen eines Elements
|
||||
// Die Bits im String-ID:
|
||||
// 0x8000 - Argv ist belegt
|
||||
|
||||
// the bits in the String-ID:
|
||||
// 0x8000 - Argv is reserved
|
||||
|
||||
SbxVariable* SbiRuntime::FindElement
|
||||
( SbxObject* pObj, sal_uInt32 nOp1, sal_uInt32 nOp2, SbError nNotFound, sal_Bool bLocal, sal_Bool bStatic )
|
||||
@ -106,7 +106,6 @@ SbxVariable* SbiRuntime::FindElement
|
||||
}
|
||||
if( !pElem )
|
||||
{
|
||||
// Die RTL brauchen wir nicht mehr zu durchsuchen!
|
||||
sal_Bool bSave = rBasic.bNoRtl;
|
||||
rBasic.bNoRtl = sal_True;
|
||||
pElem = pObj->Find( aName, SbxCLASS_DONTCARE );
|
||||
@ -125,7 +124,7 @@ SbxVariable* SbiRuntime::FindElement
|
||||
}
|
||||
rBasic.bNoRtl = bSave;
|
||||
|
||||
// Ist es ein globaler Uno-Bezeichner?
|
||||
// is it a global uno-identifier?
|
||||
if( bLocal && !pElem )
|
||||
{
|
||||
bool bSetName = true; // preserve normal behaviour
|
||||
@ -144,8 +143,8 @@ SbxVariable* SbiRuntime::FindElement
|
||||
|
||||
if( !pElem )
|
||||
{
|
||||
// #72382 VORSICHT! Liefert jetzt wegen unbekannten
|
||||
// Modulen IMMER ein Ergebnis!
|
||||
// #72382 ATTENTION! ALWAYS returns a result now
|
||||
// because of unknown modules!
|
||||
SbUnoClass* pUnoClass = findUnoClass( aName );
|
||||
if( pUnoClass )
|
||||
{
|
||||
@ -156,18 +155,18 @@ SbxVariable* SbiRuntime::FindElement
|
||||
}
|
||||
}
|
||||
|
||||
// #62939 Wenn eine Uno-Klasse gefunden wurde, muss
|
||||
// das Wrapper-Objekt gehalten werden, da sonst auch
|
||||
// die Uno-Klasse, z.B. "stardiv" immer wieder neu
|
||||
// aus der Registry gelesen werden muss
|
||||
// #62939 If an uno-class has been found, the wrapper
|
||||
// object has to be held, because the uno-class, e. g.
|
||||
// "stardiv", has to be read out of the registry
|
||||
// every time again otherwise
|
||||
if( pElem )
|
||||
{
|
||||
// #63774 Darf nicht mit gespeichert werden!!!
|
||||
// #63774 May not be saved too!!!
|
||||
pElem->SetFlag( SBX_DONTSTORE );
|
||||
pElem->SetFlag( SBX_NO_MODIFY);
|
||||
|
||||
// #72382 Lokal speichern, sonst werden alle implizit
|
||||
// deklarierten Vars automatisch global !
|
||||
// #72382 save locally, all variables that have been declared
|
||||
// implicit would become global automatically otherwise!
|
||||
if ( bSetName )
|
||||
pElem->SetName( aName );
|
||||
refLocals->Put( pElem, refLocals->Count() );
|
||||
@ -176,32 +175,30 @@ SbxVariable* SbiRuntime::FindElement
|
||||
|
||||
if( !pElem )
|
||||
{
|
||||
// Nicht da und nicht im Objekt?
|
||||
// Hat das Ding Parameter, nicht einrichten!
|
||||
// not there and not in the object?
|
||||
// don't establish if that thing has parameters!
|
||||
if( nOp1 & 0x8000 )
|
||||
bFatalError = sal_True;
|
||||
|
||||
// Sonst, falls keine Parameter sind, anderen Error Code verwenden
|
||||
// else, if there are parameters, use different error code
|
||||
if( !bLocal || pImg->GetFlag( SBIMG_EXPLICIT ) )
|
||||
{
|
||||
// #39108 Bei explizit und als ELEM immer ein Fatal Error
|
||||
// #39108 if explicit and as ELEM always a fatal error
|
||||
bFatalError = sal_True;
|
||||
|
||||
// Falls keine Parameter sind, anderen Error Code verwenden
|
||||
|
||||
if( !( nOp1 & 0x8000 ) && nNotFound == SbERR_PROC_UNDEFINED )
|
||||
nNotFound = SbERR_VAR_UNDEFINED;
|
||||
}
|
||||
if( bFatalError )
|
||||
{
|
||||
// #39108 Statt FatalError zu setzen, Dummy-Variable liefern
|
||||
// #39108 use dummy variable instead of fatal error
|
||||
if( !xDummyVar.Is() )
|
||||
xDummyVar = new SbxVariable( SbxVARIANT );
|
||||
pElem = xDummyVar;
|
||||
|
||||
// Parameter von Hand loeschen
|
||||
ClearArgvStack();
|
||||
|
||||
// Normalen Error setzen
|
||||
Error( nNotFound, aName );
|
||||
}
|
||||
else
|
||||
@ -210,7 +207,6 @@ SbxVariable* SbiRuntime::FindElement
|
||||
pElem = StepSTATIC_Impl( aName, t );
|
||||
if ( !pElem )
|
||||
{
|
||||
// Sonst Variable neu anlegen
|
||||
pElem = new SbxVariable( t );
|
||||
if( t != SbxVARIANT )
|
||||
pElem->SetFlag( SBX_FIXED );
|
||||
@ -220,15 +216,14 @@ SbxVariable* SbiRuntime::FindElement
|
||||
}
|
||||
}
|
||||
}
|
||||
// #39108 Args koennen schon geloescht sein!
|
||||
// #39108 Args can already be deleted!
|
||||
if( !bFatalError )
|
||||
SetupArgs( pElem, nOp1 );
|
||||
// Ein bestimmter Call-Type wurde gewuenscht, daher muessen
|
||||
// wir hier den Typ setzen und das Ding anfassen, um den
|
||||
// korrekten Returnwert zu erhalten!
|
||||
|
||||
// because a particular call-type is requested
|
||||
if( pElem->IsA( TYPE(SbxMethod) ) )
|
||||
{
|
||||
// Soll der Typ konvertiert werden?
|
||||
// shall the type be converted?
|
||||
SbxDataType t2 = pElem->GetType();
|
||||
sal_Bool bSet = sal_False;
|
||||
if( !( pElem->GetFlags() & SBX_FIXED ) )
|
||||
@ -237,75 +232,70 @@ SbxVariable* SbiRuntime::FindElement
|
||||
t >= SbxINTEGER && t <= SbxSTRING )
|
||||
pElem->SetType( t ), bSet = sal_True;
|
||||
}
|
||||
// pElem auf eine Ref zuweisen, um ggf. eine Temp-Var zu loeschen
|
||||
// assign pElem to a Ref, to delete a temp-var if applicable
|
||||
SbxVariableRef refTemp = pElem;
|
||||
|
||||
// Moegliche Reste vom letzten Aufruf der SbxMethod beseitigen
|
||||
// Vorher Schreiben freigeben, damit kein Error gesetzt wird.
|
||||
// remove potential rests of the last call of the SbxMethod
|
||||
// free Write before, so that there's no error
|
||||
sal_uInt16 nSavFlags = pElem->GetFlags();
|
||||
pElem->SetFlag( SBX_READWRITE | SBX_NO_BROADCAST );
|
||||
pElem->SbxValue::Clear();
|
||||
pElem->SetFlags( nSavFlags );
|
||||
|
||||
// Erst nach dem Setzen anfassen, da z.B. LEFT()
|
||||
// den Unterschied zwischen Left$() und Left() kennen muss
|
||||
// don't touch before setting, as e. g. LEFT()
|
||||
// has to know the difference between Left$() and Left()
|
||||
|
||||
// Da in PopVar() die Parameter von Methoden weggehauen
|
||||
// werden, muessen wir hier explizit eine neue SbxMethod anlegen
|
||||
SbxVariable* pNew = new SbxMethod( *((SbxMethod*)pElem) ); // das ist der Call!
|
||||
//ALT: SbxVariable* pNew = new SbxVariable( *pElem ); // das ist der Call!
|
||||
// because the methods' parameters are cut away in PopVar()
|
||||
SbxVariable* pNew = new SbxMethod( *((SbxMethod*)pElem) );
|
||||
//OLD: SbxVariable* pNew = new SbxVariable( *pElem );
|
||||
|
||||
pElem->SetParameters(0); // sonst bleibt Ref auf sich selbst
|
||||
pElem->SetParameters(0);
|
||||
pNew->SetFlag( SBX_READWRITE );
|
||||
|
||||
// den Datentypen zuruecksetzen?
|
||||
if( bSet )
|
||||
pElem->SetType( t2 );
|
||||
pElem = pNew;
|
||||
}
|
||||
// Index-Access bei UnoObjekten beruecksichtigen
|
||||
// consider index-access for UnoObjects
|
||||
// definitely we want this for VBA where properties are often
|
||||
// collections ( which need index access ), but lets only do
|
||||
// this if we actually have params following
|
||||
else if( bVBAEnabled && pElem->ISA(SbUnoProperty) && pElem->GetParameters() )
|
||||
{
|
||||
// pElem auf eine Ref zuweisen, um ggf. eine Temp-Var zu loeschen
|
||||
SbxVariableRef refTemp = pElem;
|
||||
|
||||
// Variable kopieren und dabei den Notify aufloesen
|
||||
SbxVariable* pNew = new SbxVariable( *((SbxVariable*)pElem) ); // das ist der Call!
|
||||
pElem->SetParameters( NULL ); // sonst bleibt Ref auf sich selbst
|
||||
// dissolve the notify while copying variable
|
||||
SbxVariable* pNew = new SbxVariable( *((SbxVariable*)pElem) );
|
||||
pElem->SetParameters( NULL );
|
||||
pElem = pNew;
|
||||
}
|
||||
}
|
||||
return CheckArray( pElem );
|
||||
}
|
||||
|
||||
// Find-Funktion ueber Name fuer aktuellen Scope (z.B. Abfrage aus BASIC-IDE)
|
||||
// for current scope (e. g. query from BASIC-IDE)
|
||||
SbxBase* SbiRuntime::FindElementExtern( const String& rName )
|
||||
{
|
||||
// Hinweis zu: Es darf nicht davon ausgegangen werden, dass
|
||||
// pMeth != null, da im RunInit noch keine gesetzt ist.
|
||||
// don't expect pMeth to be != 0, as there are none set
|
||||
// in the RunInit yet
|
||||
|
||||
SbxVariable* pElem = NULL;
|
||||
if( !pMod || !rName.Len() )
|
||||
return NULL;
|
||||
|
||||
// Lokal suchen
|
||||
if( refLocals )
|
||||
pElem = refLocals->Find( rName, SbxCLASS_DONTCARE );
|
||||
|
||||
// In Statics suchen
|
||||
if ( !pElem && pMeth )
|
||||
{
|
||||
// Bei Statics, Name der Methode davor setzen
|
||||
// for statics, set the method's name in front
|
||||
String aMethName = pMeth->GetName();
|
||||
aMethName += ':';
|
||||
aMethName += rName;
|
||||
pElem = pMod->Find(aMethName, SbxCLASS_DONTCARE);
|
||||
}
|
||||
|
||||
// In Parameter-Liste suchen
|
||||
// search in parameter list
|
||||
if( !pElem && pMeth )
|
||||
{
|
||||
SbxInfo* pInfo = pMeth->GetInfo();
|
||||
@ -335,10 +325,9 @@ SbxBase* SbiRuntime::FindElementExtern( const String& rName )
|
||||
}
|
||||
}
|
||||
|
||||
// Im Modul suchen
|
||||
// search in module
|
||||
if( !pElem )
|
||||
{
|
||||
// RTL nicht durchsuchen!
|
||||
sal_Bool bSave = rBasic.bNoRtl;
|
||||
rBasic.bNoRtl = sal_True;
|
||||
pElem = pMod->Find( rName, SbxCLASS_DONTCARE );
|
||||
@ -348,9 +337,6 @@ SbxBase* SbiRuntime::FindElementExtern( const String& rName )
|
||||
}
|
||||
|
||||
|
||||
// Argumente eines Elements setzen
|
||||
// Dabei auch die Argumente umsetzen, falls benannte Parameter
|
||||
// verwendet wurden
|
||||
|
||||
void SbiRuntime::SetupArgs( SbxVariable* p, sal_uInt32 nOp1 )
|
||||
{
|
||||
@ -370,9 +356,6 @@ void SbiRuntime::SetupArgs( SbxVariable* p, sal_uInt32 nOp1 )
|
||||
}
|
||||
if( bHasNamed )
|
||||
{
|
||||
// Wir haben mindestens einen benannten Parameter!
|
||||
// Wir muessen also umsortieren
|
||||
// Gibt es Parameter-Infos?
|
||||
SbxInfo* pInfo = p->GetInfo();
|
||||
if( !pInfo )
|
||||
{
|
||||
@ -449,7 +432,7 @@ void SbiRuntime::SetupArgs( SbxVariable* p, sal_uInt32 nOp1 )
|
||||
const String& rName = refArgv->GetAlias( i );
|
||||
if( rName.Len() )
|
||||
{
|
||||
// nCurPar wird auf den gefundenen Parameter gesetzt
|
||||
// nCurPar is set to the found parameter
|
||||
sal_uInt16 j = 1;
|
||||
const SbxParamInfo* pParam = pInfo->GetParam( j );
|
||||
while( pParam )
|
||||
@ -471,7 +454,7 @@ void SbiRuntime::SetupArgs( SbxVariable* p, sal_uInt32 nOp1 )
|
||||
refArgv = pArg;
|
||||
}
|
||||
}
|
||||
// Eigene Var als Parameter 0
|
||||
// own var as parameter 0
|
||||
refArgv->Put( p, 0 );
|
||||
p->SetParameters( refArgv );
|
||||
PopArgv();
|
||||
@ -480,11 +463,10 @@ void SbiRuntime::SetupArgs( SbxVariable* p, sal_uInt32 nOp1 )
|
||||
p->SetParameters( NULL );
|
||||
}
|
||||
|
||||
// Holen eines Array-Elements
|
||||
// getting an array element
|
||||
|
||||
SbxVariable* SbiRuntime::CheckArray( SbxVariable* pElem )
|
||||
{
|
||||
// Falls wir ein Array haben, wollen wir bitte das Array-Element!
|
||||
SbxArray* pPar;
|
||||
if( ( pElem->GetType() & SbxARRAY ) && (SbxVariable*)refRedim != pElem )
|
||||
{
|
||||
@ -493,8 +475,8 @@ SbxVariable* SbiRuntime::CheckArray( SbxVariable* pElem )
|
||||
pPar = pElem->GetParameters();
|
||||
if( pDimArray )
|
||||
{
|
||||
// Die Parameter koennen fehlen, wenn ein Array als
|
||||
// Argument uebergeben wird.
|
||||
// parameters may be missing, if an array is
|
||||
// passed as an argument
|
||||
if( pPar )
|
||||
pElem = pDimArray->Get( pPar );
|
||||
}
|
||||
@ -513,17 +495,17 @@ SbxVariable* SbiRuntime::CheckArray( SbxVariable* pElem )
|
||||
}
|
||||
}
|
||||
|
||||
// #42940, 0.Parameter zu NULL setzen, damit sich Var nicht selbst haelt
|
||||
// #42940, set parameter 0 to NULL so that var doesn't contain itself
|
||||
if( pPar )
|
||||
pPar->Put( NULL, 0 );
|
||||
}
|
||||
// Index-Access bei UnoObjekten beruecksichtigen
|
||||
// consider index-access for UnoObjects
|
||||
else if( pElem->GetType() == SbxOBJECT && !pElem->ISA(SbxMethod) && ( !bVBAEnabled || ( bVBAEnabled && !pElem->ISA(SbxProperty) ) ) )
|
||||
{
|
||||
pPar = pElem->GetParameters();
|
||||
if ( pPar )
|
||||
{
|
||||
// Ist es ein Uno-Objekt?
|
||||
// is it an uno-object?
|
||||
SbxBaseRef pObj = (SbxBase*)pElem->GetObject();
|
||||
if( pObj )
|
||||
{
|
||||
@ -538,7 +520,6 @@ SbxVariable* SbiRuntime::CheckArray( SbxVariable* pElem )
|
||||
Reference< XIndexAccess > xIndexAccess( x, UNO_QUERY );
|
||||
if ( !bVBAEnabled )
|
||||
{
|
||||
// Haben wir Index-Access?
|
||||
if( xIndexAccess.is() )
|
||||
{
|
||||
sal_uInt32 nParamCount = (sal_uInt32)pPar->Count() - 1;
|
||||
@ -548,7 +529,7 @@ SbxVariable* SbiRuntime::CheckArray( SbxVariable* pElem )
|
||||
return pElem;
|
||||
}
|
||||
|
||||
// Index holen
|
||||
// get index
|
||||
sal_Int32 nIndex = pPar->Get( 1 )->GetLong();
|
||||
Reference< XInterface > xRet;
|
||||
try
|
||||
@ -560,18 +541,18 @@ SbxVariable* SbiRuntime::CheckArray( SbxVariable* pElem )
|
||||
}
|
||||
catch (const IndexOutOfBoundsException&)
|
||||
{
|
||||
// Bei Exception erstmal immer von Konvertierungs-Problem ausgehen
|
||||
// usually expect converting problem
|
||||
StarBASIC::Error( SbERR_OUT_OF_RANGE );
|
||||
}
|
||||
|
||||
// #57847 Immer neue Variable anlegen, sonst Fehler
|
||||
// durch PutObject(NULL) bei ReadOnly-Properties.
|
||||
// #57847 always create a new variable, else error
|
||||
// due to PutObject(NULL) at ReadOnly-properties
|
||||
pElem = new SbxVariable( SbxVARIANT );
|
||||
if( xRet.is() )
|
||||
{
|
||||
aAny <<= xRet;
|
||||
|
||||
// #67173 Kein Namen angeben, damit echter Klassen-Namen eintragen wird
|
||||
// #67173 don't specify a name so that the real class name is entered
|
||||
String aName;
|
||||
SbxObjectRef xWrapper = (SbxObject*)new SbUnoObject( aName, aAny );
|
||||
pElem->PutObject( xWrapper );
|
||||
@ -607,7 +588,7 @@ SbxVariable* SbiRuntime::CheckArray( SbxVariable* pElem )
|
||||
}
|
||||
}
|
||||
|
||||
// #42940, 0.Parameter zu NULL setzen, damit sich Var nicht selbst haelt
|
||||
// #42940, set parameter 0 to NULL so that var doesn't contain itself
|
||||
pPar->Put( NULL, 0 );
|
||||
}
|
||||
else if( pObj->ISA(BasicCollection) )
|
||||
@ -630,7 +611,7 @@ SbxVariable* SbiRuntime::CheckArray( SbxVariable* pElem )
|
||||
return pElem;
|
||||
}
|
||||
|
||||
// Laden eines Elements aus der Runtime-Library (+StringID+Typ)
|
||||
// loading an element from the runtime-library (+StringID+type)
|
||||
|
||||
void SbiRuntime::StepRTL( sal_uInt32 nOp1, sal_uInt32 nOp2 )
|
||||
{
|
||||
@ -644,7 +625,7 @@ SbiRuntime::StepFIND_Impl( SbxObject* pObj, sal_uInt32 nOp1, sal_uInt32 nOp2, Sb
|
||||
refLocals = new SbxArray;
|
||||
PushVar( FindElement( pObj, nOp1, nOp2, nNotFound, bLocal, bStatic ) );
|
||||
}
|
||||
// Laden einer lokalen/globalen Variablen (+StringID+Typ)
|
||||
// loading a local/global variable (+StringID+type)
|
||||
|
||||
void SbiRuntime::StepFIND( sal_uInt32 nOp1, sal_uInt32 nOp2 )
|
||||
{
|
||||
@ -670,12 +651,11 @@ void SbiRuntime::StepFIND_STATIC( sal_uInt32 nOp1, sal_uInt32 nOp2 )
|
||||
StepFIND_Impl( pMod, nOp1, nOp2, SbERR_PROC_UNDEFINED, sal_True, sal_True );
|
||||
}
|
||||
|
||||
// Laden eines Objekt-Elements (+StringID+Typ)
|
||||
// Das Objekt liegt auf TOS
|
||||
// loading an object-element (+StringID+type)
|
||||
// the object lies on TOS
|
||||
|
||||
void SbiRuntime::StepELEM( sal_uInt32 nOp1, sal_uInt32 nOp2 )
|
||||
{
|
||||
// Liegt auf dem TOS ein Objekt?
|
||||
SbxVariableRef pObjVar = PopVar();
|
||||
|
||||
SbxObject* pObj = PTR_CAST(SbxObject,(SbxVariable*) pObjVar);
|
||||
@ -685,20 +665,20 @@ void SbiRuntime::StepELEM( sal_uInt32 nOp1, sal_uInt32 nOp2 )
|
||||
pObj = PTR_CAST(SbxObject,pObjVarObj);
|
||||
}
|
||||
|
||||
// #56368 Bei StepElem Referenz sichern, sonst koennen Objekte
|
||||
// in Qualifizierungsketten wie ActiveComponent.Selection(0).Text
|
||||
// zu fueh die Referenz verlieren
|
||||
// #74254 Jetzt per Liste
|
||||
// #56368 save reference at StepElem, otherwise objects could
|
||||
// lose their reference too early in qualification chains like
|
||||
// ActiveComponent.Selection(0).Text
|
||||
// #74254 now per list
|
||||
if( pObj )
|
||||
SaveRef( (SbxVariable*)pObj );
|
||||
|
||||
PushVar( FindElement( pObj, nOp1, nOp2, SbERR_NO_METHOD, sal_False ) );
|
||||
}
|
||||
|
||||
// Laden eines Parameters (+Offset+Typ)
|
||||
// Wenn der Datentyp nicht stimmen sollte, eine Kopie anlegen
|
||||
// Der Datentyp SbxEMPTY zeigt an, daa kein Parameter angegeben ist.
|
||||
// Get( 0 ) darf EMPTY sein
|
||||
// loading a parameter (+offset+type)
|
||||
// If the data type is wrong, create a copy.
|
||||
// The data type SbxEMPTY shows that no parameters are given.
|
||||
// Get( 0 ) may be EMPTY
|
||||
|
||||
void SbiRuntime::StepPARAM( sal_uInt32 nOp1, sal_uInt32 nOp2 )
|
||||
{
|
||||
@ -706,7 +686,7 @@ void SbiRuntime::StepPARAM( sal_uInt32 nOp1, sal_uInt32 nOp2 )
|
||||
SbxDataType t = (SbxDataType) nOp2;
|
||||
SbxVariable* p;
|
||||
|
||||
// #57915 Missing sauberer loesen
|
||||
// #57915 solve missing in a cleaner way
|
||||
sal_uInt16 nParamCount = refParams->Count();
|
||||
if( i >= nParamCount )
|
||||
{
|
||||
@ -724,7 +704,7 @@ void SbiRuntime::StepPARAM( sal_uInt32 nOp1, sal_uInt32 nOp2 )
|
||||
p->PutString( String() );
|
||||
}
|
||||
else
|
||||
p->PutErr( 448 ); // Wie in VB: Error-Code 448 (SbERR_NAMED_NOT_FOUND)
|
||||
p->PutErr( 448 ); // like in VB: Error-Code 448 (SbERR_NAMED_NOT_FOUND)
|
||||
|
||||
refParams->Put( p, iLoop );
|
||||
iLoop--;
|
||||
@ -734,7 +714,7 @@ void SbiRuntime::StepPARAM( sal_uInt32 nOp1, sal_uInt32 nOp2 )
|
||||
|
||||
if( p->GetType() == SbxERROR && ( i ) )
|
||||
{
|
||||
// Wenn ein Parameter fehlt, kann er OPTIONAL sein
|
||||
// if there's a parameter missing, it can be OPTIONAL
|
||||
sal_Bool bOpt = sal_False;
|
||||
if( pMeth )
|
||||
{
|
||||
@ -789,8 +769,8 @@ void SbiRuntime::StepCASEIS( sal_uInt32 nOp1, sal_uInt32 nOp2 )
|
||||
}
|
||||
}
|
||||
|
||||
// Aufruf einer DLL-Prozedur (+StringID+Typ)
|
||||
// Auch hier zeigt das MSB des StringIDs an, dass Argv belegt ist
|
||||
// call of a DLL-procedure (+StringID+type)
|
||||
// the StringID's MSB shows that Argv is occupied
|
||||
|
||||
void SbiRuntime::StepCALL( sal_uInt32 nOp1, sal_uInt32 nOp2 )
|
||||
{
|
||||
@ -804,8 +784,7 @@ void SbiRuntime::StepCALL( sal_uInt32 nOp1, sal_uInt32 nOp2 )
|
||||
PopArgv();
|
||||
}
|
||||
|
||||
// Aufruf einer DLL-Prozedur nach CDecl (+StringID+Typ)
|
||||
// Auch hier zeigt das MSB des StringIDs an, dass Argv belegt ist
|
||||
// call of a DLL-procedure after CDecl (+StringID+type)
|
||||
|
||||
void SbiRuntime::StepCALLC( sal_uInt32 nOp1, sal_uInt32 nOp2 )
|
||||
{
|
||||
@ -820,12 +799,12 @@ void SbiRuntime::StepCALLC( sal_uInt32 nOp1, sal_uInt32 nOp2 )
|
||||
}
|
||||
|
||||
|
||||
// Beginn eines Statements (+Line+Col)
|
||||
// beginning of a statement (+Line+Col)
|
||||
|
||||
void SbiRuntime::StepSTMNT( sal_uInt32 nOp1, sal_uInt32 nOp2 )
|
||||
{
|
||||
// Wenn der Expr-Stack am Anfang einen Statements eine Variable enthaelt,
|
||||
// hat ein Trottel X als Funktion aufgerufen, obwohl es eine Variable ist!
|
||||
// If the Expr-Stack at the beginning of a statement constains a variable,
|
||||
// some fool has called X as a function, although it's a variable!
|
||||
sal_Bool bFatalExpr = sal_False;
|
||||
String sUnknownMethodName;
|
||||
if( nExprLvl > 1 )
|
||||
@ -840,13 +819,13 @@ void SbiRuntime::StepSTMNT( sal_uInt32 nOp1, sal_uInt32 nOp2 )
|
||||
bFatalExpr = sal_True;
|
||||
}
|
||||
}
|
||||
// Der Expr-Stack ist nun nicht mehr notwendig
|
||||
|
||||
ClearExprStack();
|
||||
|
||||
ClearRefs();
|
||||
|
||||
// Wir muessen hier hart abbrechen, da sonst Zeile und Spalte nicht mehr
|
||||
// stimmen!
|
||||
// We have to cancel hard here because line and column
|
||||
// would be wrong later otherwise!
|
||||
if( bFatalExpr)
|
||||
{
|
||||
StarBASIC::FatalError( SbERR_NO_METHOD, sUnknownMethodName );
|
||||
@ -856,13 +835,11 @@ void SbiRuntime::StepSTMNT( sal_uInt32 nOp1, sal_uInt32 nOp2 )
|
||||
sal_uInt16 nOld = nLine;
|
||||
nLine = static_cast<short>( nOp1 );
|
||||
|
||||
// #29955 & 0xFF, um for-Schleifen-Ebene wegzufiltern
|
||||
// #29955 & 0xFF, to filter out for-loop-level
|
||||
nCol1 = static_cast<short>( nOp2 & 0xFF );
|
||||
|
||||
// Suchen des naechsten STMNT-Befehls,
|
||||
// um die End-Spalte dieses Statements zu setzen
|
||||
// Searches of the next STMNT instruction,
|
||||
// around the final column of this statement to set
|
||||
// find the next STMNT-command to set the final column
|
||||
// of this statement
|
||||
|
||||
nCol2 = 0xffff;
|
||||
sal_uInt16 n1, n2;
|
||||
@ -871,37 +848,36 @@ void SbiRuntime::StepSTMNT( sal_uInt32 nOp1, sal_uInt32 nOp2 )
|
||||
{
|
||||
if( n1 == nOp1 )
|
||||
{
|
||||
// #29955 & 0xFF, um for-Schleifen-Ebene wegzufiltern
|
||||
// #29955 & 0xFF, to filter out for-loop-level
|
||||
nCol2 = (n2 & 0xFF) - 1;
|
||||
}
|
||||
}
|
||||
|
||||
// #29955 for-Schleifen-Ebene korrigieren, #67452 NICHT im Error-Handler sonst Chaos
|
||||
// #29955 correct for-loop-level, #67452 NOT in the error-handler
|
||||
if( !bInError )
|
||||
{
|
||||
// (Bei Spr<70>ngen aus Schleifen tritt hier eine Differenz auf)
|
||||
// (there's a difference here in case of a jump out of a loop)
|
||||
sal_uInt16 nExspectedForLevel = static_cast<sal_uInt16>( nOp2 / 0x100 );
|
||||
if( pGosubStk )
|
||||
nExspectedForLevel = nExspectedForLevel + pGosubStk->nStartForLvl;
|
||||
|
||||
// Wenn der tatsaechliche For-Level zu klein ist, wurde aus
|
||||
// einer Schleife heraus gesprungen -> korrigieren
|
||||
// if the actual for-level is too small it'd jump out
|
||||
// of a loop -> corrected
|
||||
while( nForLvl > nExspectedForLevel )
|
||||
PopFor();
|
||||
}
|
||||
|
||||
// 16.10.96: #31460 Neues Konzept fuer StepInto/Over/Out
|
||||
// Erkl<EFBFBD>rung siehe bei _ImplGetBreakCallLevel.
|
||||
// 16.10.96: #31460 new concept for StepInto/Over/Out
|
||||
// see explanation at _ImplGetBreakCallLevel
|
||||
if( pInst->nCallLvl <= pInst->nBreakCallLvl )
|
||||
{
|
||||
StarBASIC* pStepBasic = GetCurrentBasic( &rBasic );
|
||||
sal_uInt16 nNewFlags = pStepBasic->StepPoint( nLine, nCol1, nCol2 );
|
||||
|
||||
// Neuen BreakCallLevel ermitteln
|
||||
pInst->CalcBreakCallLevel( nNewFlags );
|
||||
}
|
||||
|
||||
// Breakpoints nur bei STMNT-Befehlen in neuer Zeile!
|
||||
// break points only at STMNT-commands in a new line!
|
||||
else if( ( nOp1 != nOld )
|
||||
&& ( nFlags & SbDEBUG_BREAK )
|
||||
&& pMod->IsBP( static_cast<sal_uInt16>( nOp1 ) ) )
|
||||
@ -909,15 +885,14 @@ void SbiRuntime::StepSTMNT( sal_uInt32 nOp1, sal_uInt32 nOp2 )
|
||||
StarBASIC* pBreakBasic = GetCurrentBasic( &rBasic );
|
||||
sal_uInt16 nNewFlags = pBreakBasic->BreakPoint( nLine, nCol1, nCol2 );
|
||||
|
||||
// Neuen BreakCallLevel ermitteln
|
||||
pInst->CalcBreakCallLevel( nNewFlags );
|
||||
}
|
||||
}
|
||||
|
||||
// (+SvStreamFlags+Flags)
|
||||
// Stack: Blocklaenge
|
||||
// Kanalnummer
|
||||
// Dateiname
|
||||
// Stack: block length
|
||||
// channel number
|
||||
// file name
|
||||
|
||||
void SbiRuntime::StepOPEN( sal_uInt32 nOp1, sal_uInt32 nOp2 )
|
||||
{
|
||||
@ -932,7 +907,7 @@ void SbiRuntime::StepOPEN( sal_uInt32 nOp1, sal_uInt32 nOp2 )
|
||||
Error( pIosys->GetError() );
|
||||
}
|
||||
|
||||
// Objekt kreieren (+StringID+StringID)
|
||||
// create object (+StringID+StringID)
|
||||
|
||||
void SbiRuntime::StepCREATE( sal_uInt32 nOp1, sal_uInt32 nOp2 )
|
||||
{
|
||||
@ -944,7 +919,7 @@ void SbiRuntime::StepCREATE( sal_uInt32 nOp1, sal_uInt32 nOp2 )
|
||||
{
|
||||
String aName( pImg->GetString( static_cast<short>( nOp1 ) ) );
|
||||
pObj->SetName( aName );
|
||||
// Das Objekt muss BASIC rufen koennen
|
||||
// the object must be able to call the BASIC
|
||||
pObj->SetParent( &rBasic );
|
||||
SbxVariable* pNew = new SbxVariable;
|
||||
pNew->PutObject( pObj );
|
||||
@ -983,14 +958,14 @@ void implCopyDimArray_DCREATE( SbxDimArray* pNewArray, SbxDimArray* pOldArray, s
|
||||
}
|
||||
}
|
||||
|
||||
// #56204 Objekt-Array kreieren (+StringID+StringID), DCREATE == Dim-Create
|
||||
// #56204 create object array (+StringID+StringID), DCREATE == Dim-Create
|
||||
void SbiRuntime::StepDCREATE_IMPL( sal_uInt32 nOp1, sal_uInt32 nOp2 )
|
||||
{
|
||||
SbxVariableRef refVar = PopVar();
|
||||
|
||||
DimImpl( refVar );
|
||||
|
||||
// Das Array mit Instanzen der geforderten Klasse fuellen
|
||||
// fill the array with instances of the requested class
|
||||
SbxBaseRef xObj = (SbxBase*)refVar->GetObject();
|
||||
if( !xObj )
|
||||
{
|
||||
@ -1004,11 +979,10 @@ void SbiRuntime::StepDCREATE_IMPL( sal_uInt32 nOp1, sal_uInt32 nOp2 )
|
||||
SbxBase* pObj = (SbxBase*)xObj;
|
||||
pArray = (SbxDimArray*)pObj;
|
||||
|
||||
// Dimensionen auswerten
|
||||
short nDims = pArray->GetDims();
|
||||
sal_Int32 nTotalSize = 0;
|
||||
|
||||
// es muss ein eindimensionales Array sein
|
||||
// must be a one-dimensional array
|
||||
sal_Int32 nLower, nUpper, nSize;
|
||||
sal_Int32 i;
|
||||
for( i = 0 ; i < nDims ; i++ )
|
||||
@ -1021,7 +995,7 @@ void SbiRuntime::StepDCREATE_IMPL( sal_uInt32 nOp1, sal_uInt32 nOp2 )
|
||||
nTotalSize *= nSize;
|
||||
}
|
||||
|
||||
// Objekte anlegen und ins Array eintragen
|
||||
// create objects and insert them into the array
|
||||
String aClass( pImg->GetString( static_cast<short>( nOp2 ) ) );
|
||||
for( i = 0 ; i < nTotalSize ; i++ )
|
||||
{
|
||||
@ -1035,7 +1009,7 @@ void SbiRuntime::StepDCREATE_IMPL( sal_uInt32 nOp1, sal_uInt32 nOp2 )
|
||||
{
|
||||
String aName( pImg->GetString( static_cast<short>( nOp1 ) ) );
|
||||
pClassObj->SetName( aName );
|
||||
// Das Objekt muss BASIC rufen koennen
|
||||
// the object must be able to call the basic
|
||||
pClassObj->SetParent( &rBasic );
|
||||
pArray->SbxArray::Put32( pClassObj, i );
|
||||
}
|
||||
@ -1095,7 +1069,7 @@ void SbiRuntime::StepDCREATE_IMPL( sal_uInt32 nOp1, sal_uInt32 nOp2 )
|
||||
}
|
||||
}
|
||||
|
||||
// Objekt aus User-Type kreieren (+StringID+StringID)
|
||||
// create object from user-type (+StringID+StringID)
|
||||
|
||||
SbxObject* createUserTypeImpl( const String& rClassName ); // sb.cxx
|
||||
|
||||
@ -1137,7 +1111,7 @@ void SbiRuntime::implHandleSbxFlags( SbxVariable* pVar, SbxDataType t, sal_uInt3
|
||||
pVar->SetFlag( SBX_VAR_TO_DIM );
|
||||
}
|
||||
|
||||
// Einrichten einer lokalen Variablen (+StringID+Typ)
|
||||
// establishing a local variable (+StringID+type)
|
||||
|
||||
void SbiRuntime::StepLOCAL( sal_uInt32 nOp1, sal_uInt32 nOp2 )
|
||||
{
|
||||
@ -1154,7 +1128,7 @@ void SbiRuntime::StepLOCAL( sal_uInt32 nOp1, sal_uInt32 nOp2 )
|
||||
}
|
||||
}
|
||||
|
||||
// Einrichten einer modulglobalen Variablen (+StringID+Typ)
|
||||
// establishing a module-global variable (+StringID+type)
|
||||
|
||||
void SbiRuntime::StepPUBLIC_Impl( sal_uInt32 nOp1, sal_uInt32 nOp2, bool bUsedForClassModule )
|
||||
{
|
||||
@ -1173,7 +1147,7 @@ void SbiRuntime::StepPUBLIC_Impl( sal_uInt32 nOp1, sal_uInt32 nOp2, bool bUsedFo
|
||||
if( pProp )
|
||||
{
|
||||
pProp->SetFlag( SBX_DONTSTORE );
|
||||
// AB: 2.7.1996: HACK wegen 'Referenz kann nicht gesichert werden'
|
||||
// from 2.7.1996: HACK because of 'reference can't be saved'
|
||||
pProp->SetFlag( SBX_NO_MODIFY);
|
||||
|
||||
implHandleSbxFlags( pProp, t, nOp2 );
|
||||
@ -1196,7 +1170,7 @@ void SbiRuntime::StepPUBLIC_P( sal_uInt32 nOp1, sal_uInt32 nOp2 )
|
||||
}
|
||||
}
|
||||
|
||||
// Einrichten einer globalen Variablen (+StringID+Typ)
|
||||
// establishing a global variable (+StringID+type)
|
||||
|
||||
void SbiRuntime::StepGLOBAL( sal_uInt32 nOp1, sal_uInt32 nOp2 )
|
||||
{
|
||||
@ -1227,7 +1201,7 @@ void SbiRuntime::StepGLOBAL( sal_uInt32 nOp1, sal_uInt32 nOp2 )
|
||||
if( p )
|
||||
{
|
||||
p->SetFlag( SBX_DONTSTORE );
|
||||
// AB: 2.7.1996: HACK wegen 'Referenz kann nicht gesichert werden'
|
||||
// from 2.7.1996: HACK because of 'reference can't be saved'
|
||||
p->SetFlag( SBX_NO_MODIFY);
|
||||
}
|
||||
}
|
||||
@ -1285,7 +1259,7 @@ SbxVariable* SbiRuntime::StepSTATIC_Impl( String& aName, SbxDataType& t )
|
||||
}
|
||||
return p;
|
||||
}
|
||||
// Einrichten einer statischen Variablen (+StringID+Typ)
|
||||
// establishing a static variable (+StringID+type)
|
||||
void SbiRuntime::StepSTATIC( sal_uInt32 nOp1, sal_uInt32 nOp2 )
|
||||
{
|
||||
String aName( pImg->GetString( static_cast<short>( nOp1 ) ) );
|
||||
|
@ -33,13 +33,13 @@
|
||||
#include <basic/sbx.hxx>
|
||||
#include "collelem.hxx"
|
||||
|
||||
// Das Sample-Element ist ein kleines Objekt, das die Properties
|
||||
// Name und Value enth„lt sowie die Methode Say, die den <20>bergebenen
|
||||
// Text mit dem eigenen Namen verkoppelt und ausgibt.
|
||||
// The sample-element is a small object that contains the properties
|
||||
// name and value and the method say, which couples the passed text
|
||||
// with its own name and outputs it.
|
||||
|
||||
SampleElement::SampleElement( const String& r ) : SbxObject( r )
|
||||
{
|
||||
// Methode Say mit einem String-Parameter
|
||||
// method say with a string-parameter
|
||||
SbxVariable* pMeth = Make( String( RTL_CONSTASCII_USTRINGPARAM("Say") ), SbxCLASS_METHOD, SbxEMPTY );
|
||||
pMeth->SetUserData( 0x12345678 );
|
||||
pMeth->ResetFlag( SBX_FIXED );
|
||||
@ -59,8 +59,8 @@ void SampleElement::SFX_NOTIFY( SfxBroadcaster& rBC, const TypeId& rBCType,
|
||||
sal_uIntPtr t = pHint->GetId();
|
||||
if( t == SBX_HINT_DATAWANTED && pVar->GetUserData() == 0x12345678 )
|
||||
{
|
||||
// Die Say-Methode:
|
||||
// 1 Parameter + Returnwert
|
||||
// the say-method:
|
||||
// 1 parameter + return value
|
||||
if( !pPar_ || pPar_->Count() != 2 )
|
||||
SetError( SbxERR_WRONG_ARGS );
|
||||
else
|
||||
|
@ -37,93 +37,90 @@
|
||||
#include "object.hxx"
|
||||
#include "collelem.hxx"
|
||||
|
||||
// Das Sample-Objekt hat folgende Elemente:
|
||||
// The sample-object has got the following elements:
|
||||
// 1) Properties:
|
||||
// Name der Name
|
||||
// Value ein double-Wert, beide bereits als Default drin
|
||||
// 2) Methoden:
|
||||
// Create Erzeugen eines neuen Unterelements
|
||||
// Display Ausgabe eines Textes
|
||||
// Name the name
|
||||
// Value a double-value, both already as default
|
||||
// 2) Methods:
|
||||
// Create creating a new sub-element
|
||||
// Display display a text
|
||||
// Square Argument * Argument
|
||||
// Event Aufruf eines Basic-Eventhandlers
|
||||
// 3) Unterobjekte:
|
||||
// Per Create() kann ein neues Unterelement eingerichtet werden,
|
||||
// das indiziert werden kann, falls mehrere Objekte gleichen Namens
|
||||
// existieren.
|
||||
// Diese Implementation ist ein Beispiel fuer eine tabellengesteuerte
|
||||
// Version, die sehr viele Elemente enthalten kann. Die Elemente werden
|
||||
// je nach Bedarf aus der Tabelle in das Objekt uebernommen.
|
||||
// Die Collection findet sich in COLLECTN.*, die in der Collection
|
||||
// enthaltenen Objekte in COLLELEM.*
|
||||
// Event calling a basic event handler
|
||||
// 3) Subobjects:
|
||||
// With Create() a new sub-element can be established, which
|
||||
// can be indexed if multiple objects of the same name exist.
|
||||
// This implementation is an example for a table-controlled version,
|
||||
// which can contain a lot of elements. The elements are taken from
|
||||
// the table into the object as required.
|
||||
// The collection can be found in COLLECTN.*, the collection's
|
||||
// objects in COLLELEM.*
|
||||
|
||||
// Das Sample-Objekt wird in ..\app\mybasic.cxx wie folgt in StarBASIC
|
||||
// eingebaut:
|
||||
// The sample-object is in ..\app\mybasic.cxx implemented as follows
|
||||
// in StarBASIC:
|
||||
|
||||
|
||||
// Das nArgs-Feld eines Tabelleneintrags ist wie folgt verschluesselt:
|
||||
// The nArgs-field of a table entry is encrypted as follows:
|
||||
|
||||
#define _ARGSMASK 0x00FF // Bis zu 255 Argumente
|
||||
#define _RWMASK 0x0F00 // Maske fuer R/W-Bits
|
||||
#define _TYPEMASK 0xF000 // Maske fuer den Typ des Eintrags
|
||||
#define _ARGSMASK 0x00FF // up to 255 arguments
|
||||
#define _RWMASK 0x0F00 // mask for R/W-bits
|
||||
#define _TYPEMASK 0xF000 // mask for the entry's type
|
||||
|
||||
#define _READ 0x0100 // kann gelesen werden
|
||||
#define _BWRITE 0x0200 // kann as Lvalue verwendet werden
|
||||
#define _LVALUE _BWRITE // kann as Lvalue verwendet werden
|
||||
#define _READWRITE 0x0300 // beides
|
||||
#define _OPT 0x0400 // sal_True: optionaler Parameter
|
||||
#define _METHOD 0x1000 // Masken-Bit fuer eine Methode
|
||||
#define _PROPERTY 0x2000 // Masken-Bit fuer eine Property
|
||||
#define _COLL 0x4000 // Masken-Bit fuer eine Collection
|
||||
// Kombination von oberen Bits:
|
||||
#define _FUNCTION 0x1100 // Maske fuer Function
|
||||
#define _LFUNCTION 0x1300 // Maske fuer Function, die auch als Lvalue geht
|
||||
#define _ROPROP 0x2100 // Maske Read Only-Property
|
||||
#define _WOPROP 0x2200 // Maske Write Only-Property
|
||||
#define _RWPROP 0x2300 // Maske Read/Write-Property
|
||||
#define _COLLPROP 0x4100 // Maske Read-Collection-Element
|
||||
#define _READ 0x0100 // can be read
|
||||
#define _BWRITE 0x0200 // can be used as Lvalue
|
||||
#define _LVALUE _BWRITE // can be used as Lvalue
|
||||
#define _READWRITE 0x0300 // both
|
||||
#define _OPT 0x0400 // sal_True: optional parameter
|
||||
#define _METHOD 0x1000 // mask-bit for a method
|
||||
#define _PROPERTY 0x2000 // mask-bit for a property
|
||||
#define _COLL 0x4000 // mask-bit for a collection
|
||||
// combination of the bits above:
|
||||
#define _FUNCTION 0x1100 // mask for function
|
||||
#define _LFUNCTION 0x1300 // mask for function that also works as Lvalue
|
||||
#define _ROPROP 0x2100 // mask Read Only-Property
|
||||
#define _WOPROP 0x2200 // mask Write Only-Property
|
||||
#define _RWPROP 0x2300 // mask Read/Write-Property
|
||||
#define _COLLPROP 0x4100 // mask Read-Collection-Element
|
||||
|
||||
#define COLLNAME "Elements" // Name der Collection, hier mal hart verdrahtet
|
||||
#define COLLNAME "Elements" // the collection's name, wired hard here
|
||||
|
||||
SampleObject::Methods SampleObject::aMethods[] = {
|
||||
// Eine Sample-Methode (der Returnwert ist SbxNULL)
|
||||
// a sample-method (the return value is SbxNULL)
|
||||
{ "Display", SbxEMPTY, &SampleObject::Display, 1 | _FUNCTION },
|
||||
// Ein Named Parameter
|
||||
// a named parameter
|
||||
{ "message", SbxSTRING, NULL, 0 },
|
||||
// Eine Sample-Funktion
|
||||
// a sample-function
|
||||
{ "Square", SbxDOUBLE, &SampleObject::Square, 1 | _FUNCTION },
|
||||
// Ein Named Parameter
|
||||
// a named parameter
|
||||
{ "value", SbxDOUBLE, NULL, 0 },
|
||||
// Basic-Callback
|
||||
{ "Event", SbxEMPTY, &SampleObject::Event, 1 | _FUNCTION },
|
||||
// Ein Named Parameter
|
||||
// a named parameter
|
||||
{ "event", SbxSTRING, NULL, 0 },
|
||||
// Element erzeugen
|
||||
// create element
|
||||
{ "Create", SbxEMPTY, &SampleObject::Create, 1 | _FUNCTION },
|
||||
// Ein Named Parameter
|
||||
// a named parameter
|
||||
{ "name", SbxSTRING, NULL, 0 },
|
||||
|
||||
{ NULL, SbxNULL, NULL, -1 }}; // Tabellenende
|
||||
{ NULL, SbxNULL, NULL, -1 }}; // end of the table
|
||||
|
||||
SampleObject::SampleObject( const String& rClass ) : SbxObject( rClass )
|
||||
{
|
||||
SetName( String( RTL_CONSTASCII_USTRINGPARAM("Sample") ) );
|
||||
PutDouble( 1.0 ); // Startwert fuer Value
|
||||
PutDouble( 1.0 );
|
||||
}
|
||||
|
||||
// Suche nach einem Element:
|
||||
// Hier wird linear durch die Methodentabelle gegangen, bis eine
|
||||
// passende Methode gefunden wurde.
|
||||
// Wenn die Methode/Property nicht gefunden wurde, nur NULL ohne
|
||||
// Fehlercode zurueckliefern, da so auch eine ganze Chain von
|
||||
// Objekten nach der Methode/Property befragt werden kann.
|
||||
// Finding an element:
|
||||
// It goes linearly through the method table until an adequate
|
||||
// method is found.
|
||||
// If the method/property hasn't been found, return only NULL
|
||||
// without error code so that a whole chain of objects can be
|
||||
// asked for their method/property.
|
||||
|
||||
SbxVariable* SampleObject::Find( const String& rName, SbxClassType t )
|
||||
{
|
||||
// Ist das Element bereits vorhanden?
|
||||
SbxVariable* pRes = SbxObject::Find( rName, t );
|
||||
if( !pRes && t != SbxCLASS_OBJECT )
|
||||
{
|
||||
// sonst suchen
|
||||
Methods* p = aMethods;
|
||||
short nIndex = 0;
|
||||
sal_Bool bFound = sal_False;
|
||||
@ -138,7 +135,7 @@ SbxVariable* SampleObject::Find( const String& rName, SbxClassType t )
|
||||
}
|
||||
if( bFound )
|
||||
{
|
||||
// Args-Felder isolieren:
|
||||
// isolate args-fields:
|
||||
short nAccess = ( p->nArgs & _RWMASK ) >> 8;
|
||||
short nType = ( p->nArgs & _TYPEMASK );
|
||||
String aName_ = String::CreateFromAscii( p->pName );
|
||||
@ -148,9 +145,8 @@ SbxVariable* SampleObject::Find( const String& rName, SbxClassType t )
|
||||
else if( nType & _METHOD )
|
||||
eCT = SbxCLASS_METHOD;
|
||||
pRes = Make( aName_, eCT, p->eType );
|
||||
// Wir setzen den Array-Index + 1, da ja noch andere
|
||||
// Standard-Properties existieren, die auch aktiviert
|
||||
// werden muessen.
|
||||
// We set the array-index + 1 because there are other standard-
|
||||
// properties existing which have to activated too.
|
||||
pRes->SetUserData( nIndex + 1 );
|
||||
pRes->SetFlags( nAccess );
|
||||
}
|
||||
@ -158,7 +154,7 @@ SbxVariable* SampleObject::Find( const String& rName, SbxClassType t )
|
||||
return pRes;
|
||||
}
|
||||
|
||||
// Aktivierung eines Elements oder Anfordern eines Infoblocks
|
||||
// activation of an element or ask for an info block
|
||||
|
||||
void SampleObject::SFX_NOTIFY( SfxBroadcaster& rBC, const TypeId& rBCT,
|
||||
const SfxHint& rHint, const TypeId& rHT )
|
||||
@ -169,7 +165,7 @@ void SampleObject::SFX_NOTIFY( SfxBroadcaster& rBC, const TypeId& rBCT,
|
||||
SbxVariable* pVar = pHint->GetVar();
|
||||
SbxArray* pPar_ = pVar->GetParameters();
|
||||
sal_uInt16 nIndex = (sal_uInt16) pVar->GetUserData();
|
||||
// kein Index: weiterreichen!
|
||||
// no index: hand on!
|
||||
if( nIndex )
|
||||
{
|
||||
sal_uIntPtr t = pHint->GetId();
|
||||
@ -182,13 +178,13 @@ void SampleObject::SFX_NOTIFY( SfxBroadcaster& rBC, const TypeId& rBCT,
|
||||
bWrite = sal_True;
|
||||
if( t == SBX_HINT_DATAWANTED || bWrite )
|
||||
{
|
||||
// Parameter-Test fuer Methoden:
|
||||
// parameter-test for methods:
|
||||
sal_uInt16 nPar = aMethods[ --nIndex ].nArgs & 0x00FF;
|
||||
// Element 0 ist der Returnwert
|
||||
// element 0 is the return value
|
||||
if( ( !pPar_ && nPar )
|
||||
|| ( pPar_->Count() != nPar+1 ) )
|
||||
SetError( SbxERR_WRONG_ARGS );
|
||||
// Alles klar, man kann den Call ausfuehren
|
||||
// alright, the call can be done
|
||||
else
|
||||
{
|
||||
(this->*(aMethods[ nIndex ].pFunc))( pVar, pPar_, bWrite );
|
||||
@ -200,7 +196,7 @@ void SampleObject::SFX_NOTIFY( SfxBroadcaster& rBC, const TypeId& rBCT,
|
||||
}
|
||||
}
|
||||
|
||||
// Zusammenbau der Infostruktur fuer einzelne Elemente
|
||||
// construction of the info structure for single elements
|
||||
|
||||
SbxInfo* SampleObject::GetInfo( short nIdx )
|
||||
{
|
||||
@ -220,15 +216,14 @@ SbxInfo* SampleObject::GetInfo( short nIdx )
|
||||
}
|
||||
|
||||
|
||||
// Properties und Methoden legen beim Get (bPut = sal_False) den Returnwert
|
||||
// im Element 0 des Argv ab; beim Put (bPut = sal_True) wird der Wert aus
|
||||
// Element 0 gespeichert.
|
||||
// Properties and methods lay down the return value in element 0 of the
|
||||
// Argv at Get (bPut = sal_False); at Put (bPut = sal_True) the value from
|
||||
// element 0 is saved.
|
||||
|
||||
// Die Methoden:
|
||||
|
||||
void SampleObject::Display( SbxVariable*, SbxArray* pPar_, sal_Bool )
|
||||
{
|
||||
// GetString() loest u.U. auch einen Error aus!
|
||||
// GetString() might perhaps cause an error!
|
||||
String s( pPar_->Get( 1 )->GetString() );
|
||||
if( !IsError() )
|
||||
InfoBox( NULL, s ).Execute();
|
||||
@ -240,14 +235,13 @@ void SampleObject::Square( SbxVariable* pVar, SbxArray* pPar_, sal_Bool )
|
||||
pVar->PutDouble( n * n );
|
||||
}
|
||||
|
||||
// Callback nach BASIC:
|
||||
// Callback to BASIC:
|
||||
|
||||
void SampleObject::Event( SbxVariable*, SbxArray* pPar_, sal_Bool )
|
||||
{
|
||||
Call( pPar_->Get( 1 )->GetString(), NULL );
|
||||
}
|
||||
|
||||
// Neues Element anlegen
|
||||
|
||||
void SampleObject::Create( SbxVariable* pVar, SbxArray* pPar_, sal_Bool )
|
||||
{
|
||||
@ -255,7 +249,6 @@ void SampleObject::Create( SbxVariable* pVar, SbxArray* pPar_, sal_Bool )
|
||||
MakeObject( pPar_->Get( 1 )->GetString(), String( RTL_CONSTASCII_USTRINGPARAM("SampleElement") ) ) );
|
||||
}
|
||||
|
||||
// Die Factory legt unsere beiden Objekte an.
|
||||
|
||||
SbxObject* SampleObjectFac::CreateObject( const String& rClass )
|
||||
{
|
||||
|
@ -85,7 +85,7 @@ enum SbxBOOL ImpGetBool( const SbxValues* p )
|
||||
nRes = SbxTRUE;
|
||||
else if( !p->pOUString->equalsIgnoreAsciiCase( SbxRes( STRING_FALSE ) ) )
|
||||
{
|
||||
// Jetzt kann es noch in eine Zahl konvertierbar sein
|
||||
// it can be convertable to a number
|
||||
sal_Bool bError = sal_True;
|
||||
double n;
|
||||
SbxDataType t;
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -63,19 +63,15 @@ void ImpGetIntntlSep( sal_Unicode& rcDecimalSep, sal_Unicode& rcThousandSep )
|
||||
rcThousandSep = rData.getNumThousandSep().GetBuffer()[0];
|
||||
}
|
||||
|
||||
// Scannen eines Strings nach BASIC-Konventionen
|
||||
// Dies entspricht den ueblichen Konventionen, nur dass der Exponent
|
||||
// auch ein D sein darf, was den Datentyp auf SbxDOUBLE festlegt.
|
||||
// Die Routine versucht, den Datentyp so klein wie moeglich zu gestalten.
|
||||
// Das ganze gibt auch noch einen Konversionsfehler, wenn der Datentyp
|
||||
// Fixed ist und das ganze nicht hineinpasst!
|
||||
// scanning a string according to BASIC-conventions
|
||||
// but exponent may also be a D, so data type is SbxDOUBLED
|
||||
// conversion error if data type is fixed and it doesn't fit
|
||||
|
||||
SbxError ImpScan( const ::rtl::OUString& rWSrc, double& nVal, SbxDataType& rType,
|
||||
sal_uInt16* pLen, sal_Bool bAllowIntntl, sal_Bool bOnlyIntntl )
|
||||
{
|
||||
::rtl::OString aBStr( ::rtl::OUStringToOString( rWSrc, RTL_TEXTENCODING_ASCII_US ) );
|
||||
|
||||
// Bei International Komma besorgen
|
||||
char cIntntlComma, cIntntl1000;
|
||||
char cNonIntntlComma = '.';
|
||||
|
||||
@ -86,13 +82,13 @@ SbxError ImpScan( const ::rtl::OUString& rWSrc, double& nVal, SbxDataType& rType
|
||||
cIntntlComma = (char)cDecimalSep;
|
||||
cIntntl1000 = (char)cThousandSep;
|
||||
}
|
||||
// Sonst einfach auch auf . setzen
|
||||
|
||||
else
|
||||
{
|
||||
cIntntlComma = cNonIntntlComma;
|
||||
cIntntl1000 = cNonIntntlComma; // Unschaedlich machen
|
||||
cIntntl1000 = cNonIntntlComma;
|
||||
}
|
||||
// Nur International -> IntnlComma uebernehmen
|
||||
|
||||
if( bOnlyIntntl )
|
||||
{
|
||||
cNonIntntlComma = cIntntlComma;
|
||||
@ -106,20 +102,17 @@ SbxError ImpScan( const ::rtl::OUString& rWSrc, double& nVal, SbxDataType& rType
|
||||
sal_Bool bMinus = sal_False;
|
||||
nVal = 0;
|
||||
SbxDataType eScanType = SbxSINGLE;
|
||||
// Whitespace wech
|
||||
while( *p &&( *p == ' ' || *p == '\t' ) ) p++;
|
||||
// Zahl? Dann einlesen und konvertieren.
|
||||
if( *p == '-' )
|
||||
p++, bMinus = sal_True;
|
||||
if( isdigit( *p ) ||( (*p == cNonIntntlComma || *p == cIntntlComma ||
|
||||
*p == cIntntl1000) && isdigit( *(p+1 ) ) ) )
|
||||
{
|
||||
short exp = 0; // >0: Exponentteil
|
||||
short comma = 0; // >0: Nachkomma
|
||||
short ndig = 0; // Anzahl Ziffern
|
||||
short ncdig = 0; // Anzahl Ziffern nach Komma
|
||||
short exp = 0;
|
||||
short comma = 0;
|
||||
short ndig = 0;
|
||||
short ncdig = 0; // number of digits after decimal point
|
||||
ByteString aSearchStr( "0123456789DEde" );
|
||||
// Kommas ergaenzen
|
||||
aSearchStr += cNonIntntlComma;
|
||||
if( cIntntlComma != cNonIntntlComma )
|
||||
aSearchStr += cIntntlComma;
|
||||
@ -128,17 +121,15 @@ SbxError ImpScan( const ::rtl::OUString& rWSrc, double& nVal, SbxDataType& rType
|
||||
const char* pSearchStr = aSearchStr.GetBuffer();
|
||||
while( strchr( pSearchStr, *p ) && *p )
|
||||
{
|
||||
// 1000er-Trenner ueberlesen
|
||||
if( bOnlyIntntl && *p == cIntntl1000 )
|
||||
{
|
||||
p++;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Komma oder Exponent?
|
||||
if( *p == cNonIntntlComma || *p == cIntntlComma )
|
||||
{
|
||||
// Immer '.' einfuegen, damit atof funktioniert
|
||||
// always insert '.' so that atof works
|
||||
p++;
|
||||
if( ++comma > 1 )
|
||||
continue;
|
||||
@ -154,7 +145,7 @@ SbxError ImpScan( const ::rtl::OUString& rWSrc, double& nVal, SbxDataType& rType
|
||||
if( toupper( *p ) == 'D' )
|
||||
eScanType = SbxDOUBLE;
|
||||
*q++ = 'E'; p++;
|
||||
// Vorzeichen hinter Exponent?
|
||||
|
||||
if( *p == '+' )
|
||||
p++;
|
||||
else
|
||||
@ -169,10 +160,10 @@ SbxError ImpScan( const ::rtl::OUString& rWSrc, double& nVal, SbxDataType& rType
|
||||
if( !exp ) ndig++;
|
||||
}
|
||||
*q = 0;
|
||||
// Komma, Exponent mehrfach vorhanden?
|
||||
|
||||
if( comma > 1 || exp > 1 )
|
||||
bRes = sal_False;
|
||||
// Kann auf Integer gefaltet werden?
|
||||
|
||||
if( !comma && !exp )
|
||||
{
|
||||
if( nVal >= SbxMININT && nVal <= SbxMAXINT )
|
||||
@ -183,14 +174,14 @@ SbxError ImpScan( const ::rtl::OUString& rWSrc, double& nVal, SbxDataType& rType
|
||||
|
||||
nVal = atof( buf );
|
||||
ndig = ndig - comma;
|
||||
// zu viele Zahlen fuer SINGLE?
|
||||
// too many numbers for SINGLE?
|
||||
if( ndig > 15 || ncdig > 6 )
|
||||
eScanType = SbxDOUBLE;
|
||||
|
||||
// Typkennung?
|
||||
// type detection?
|
||||
if( strchr( "%!&#", *p ) && *p ) p++;
|
||||
}
|
||||
// Hex/Oktalzahl? Einlesen und konvertieren:
|
||||
// hex/octal number? read in and convert:
|
||||
else if( *p == '&' )
|
||||
{
|
||||
p++;
|
||||
@ -243,21 +234,21 @@ SbxError ImpScan( const ::rtl::OUString& rWSrc, double& nVal, SbxDataType& rType
|
||||
return SbxERR_OK;
|
||||
}
|
||||
|
||||
// Schnittstelle fuer CDbl im Basic
|
||||
// port for CDbl in the Basic
|
||||
SbxError SbxValue::ScanNumIntnl( const String& rSrc, double& nVal, sal_Bool bSingle )
|
||||
{
|
||||
SbxDataType t;
|
||||
sal_uInt16 nLen = 0;
|
||||
SbxError nRetError = ImpScan( rSrc, nVal, t, &nLen,
|
||||
/*bAllowIntntl*/sal_False, /*bOnlyIntntl*/sal_True );
|
||||
// Komplett gelesen?
|
||||
// read completely?
|
||||
if( nRetError == SbxERR_OK && nLen != rSrc.Len() )
|
||||
nRetError = SbxERR_CONVERSION;
|
||||
|
||||
if( bSingle )
|
||||
{
|
||||
SbxValues aValues( nVal );
|
||||
nVal = (double)ImpGetSingle( &aValues ); // Hier Error bei Overflow
|
||||
nVal = (double)ImpGetSingle( &aValues ); // here error at overflow
|
||||
}
|
||||
return nRetError;
|
||||
}
|
||||
@ -271,13 +262,13 @@ static double roundArray[] = {
|
||||
|*
|
||||
|* void myftoa( double, char *, short, short, sal_Bool, sal_Bool )
|
||||
|*
|
||||
|* Beschreibung: Konversion double --> ASCII
|
||||
|* Parameter: double die Zahl.
|
||||
|* char * der Zielpuffer
|
||||
|* short Anzahl Nachkommastellen
|
||||
|* short Weite des Exponenten( 0=kein E )
|
||||
|* sal_Bool sal_True: mit 1000er Punkten
|
||||
|* sal_Bool sal_True: formatfreie Ausgabe
|
||||
|* description: conversion double --> ASCII
|
||||
|* parameters: double the number
|
||||
|* char * target buffer
|
||||
|* short number of positions after decimal point
|
||||
|* short range of the exponent ( 0=no E )
|
||||
|* sal_Bool sal_True: with 1000-separators
|
||||
|* sal_Bool sal_True: output without formatting
|
||||
|*
|
||||
***************************************************************************/
|
||||
|
||||
@ -285,18 +276,17 @@ static void myftoa( double nNum, char * pBuf, short nPrec, short nExpWidth,
|
||||
sal_Bool bPt, sal_Bool bFix, sal_Unicode cForceThousandSep = 0 )
|
||||
{
|
||||
|
||||
short nExp = 0; // Exponent
|
||||
short nDig = nPrec + 1; // Anzahl Digits in Zahl
|
||||
short nDec; // Anzahl Vorkommastellen
|
||||
short nExp = 0;
|
||||
short nDig = nPrec + 1;
|
||||
short nDec; // number of positions before decimal point
|
||||
register int i;
|
||||
|
||||
// Komma besorgen
|
||||
sal_Unicode cDecimalSep, cThousandSep;
|
||||
ImpGetIntntlSep( cDecimalSep, cThousandSep );
|
||||
if( cForceThousandSep )
|
||||
cThousandSep = cForceThousandSep;
|
||||
|
||||
// Exponentberechnung:
|
||||
// compute exponent
|
||||
nExp = 0;
|
||||
if( nNum > 0.0 )
|
||||
{
|
||||
@ -308,7 +298,7 @@ static void myftoa( double nNum, char * pBuf, short nPrec, short nExpWidth,
|
||||
else if( bFix && !nPrec )
|
||||
nDig = nExp + 1;
|
||||
|
||||
// Zahl runden:
|
||||
// round number
|
||||
if( (nNum += roundArray [( nDig > 16 ) ? 16 : nDig] ) >= 10.0 )
|
||||
{
|
||||
nNum = 1.0;
|
||||
@ -316,12 +306,12 @@ static void myftoa( double nNum, char * pBuf, short nPrec, short nExpWidth,
|
||||
if( !nExpWidth ) ++nDig;
|
||||
}
|
||||
|
||||
// Bestimmung der Vorkommastellen:
|
||||
// determine positions before decimal point
|
||||
if( !nExpWidth )
|
||||
{
|
||||
if( nExp < 0 )
|
||||
{
|
||||
// #41691: Auch bei bFix eine 0 spendieren
|
||||
// #41691: also a 0 at bFix
|
||||
*pBuf++ = '0';
|
||||
if( nPrec ) *pBuf++ = (char)cDecimalSep;
|
||||
i = -nExp - 1;
|
||||
@ -335,7 +325,7 @@ static void myftoa( double nNum, char * pBuf, short nPrec, short nExpWidth,
|
||||
else
|
||||
nDec = 1;
|
||||
|
||||
// Zahl ausgeben:
|
||||
// output number
|
||||
if( nDig > 0 )
|
||||
{
|
||||
register int digit;
|
||||
@ -360,7 +350,7 @@ static void myftoa( double nNum, char * pBuf, short nPrec, short nExpWidth,
|
||||
}
|
||||
}
|
||||
|
||||
// Exponent ausgeben:
|
||||
// output exponent
|
||||
if( nExpWidth )
|
||||
{
|
||||
if( nExpWidth < 3 ) nExpWidth = 3;
|
||||
@ -380,10 +370,10 @@ static void myftoa( double nNum, char * pBuf, short nPrec, short nExpWidth,
|
||||
*pBuf = 0;
|
||||
}
|
||||
|
||||
// Die Zahl wird unformatiert mit der angegebenen Anzahl NK-Stellen
|
||||
// aufbereitet. Evtl. wird ein Minus vorangestellt.
|
||||
// Diese Routine ist public, weil sie auch von den Put-Funktionen
|
||||
// der Klasse SbxImpSTRING verwendet wird.
|
||||
// The number is prepared unformattedly with the given number of
|
||||
// NK-positions. A leading minus is added if applicable.
|
||||
// This routine is public because it's also used by the Put-functions
|
||||
// in the class SbxImpSTRING.
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma optimize( "", off )
|
||||
@ -407,7 +397,7 @@ void ImpCvtNum( double nNum, short nPrec, ::rtl::OUString& rRes, sal_Bool bCoreS
|
||||
double dMaxNumWithoutExp = (nPrec == 6) ? 1E6 : 1E14;
|
||||
myftoa( nNum, p, nPrec,( nNum &&( nNum < 1E-1 || nNum >= dMaxNumWithoutExp ) ) ? 4:0,
|
||||
sal_False, sal_True, cDecimalSep );
|
||||
// Trailing Zeroes weg:
|
||||
// remove trailing zeros
|
||||
for( p = cBuf; *p &&( *p != 'E' ); p++ ) {}
|
||||
q = p; p--;
|
||||
while( nPrec && *p == '0' ) nPrec--, p--;
|
||||
@ -423,26 +413,23 @@ void ImpCvtNum( double nNum, short nPrec, ::rtl::OUString& rRes, sal_Bool bCoreS
|
||||
|
||||
sal_Bool ImpConvStringExt( ::rtl::OUString& rSrc, SbxDataType eTargetType )
|
||||
{
|
||||
// Merken, ob ueberhaupt was geaendert wurde
|
||||
sal_Bool bChanged = sal_False;
|
||||
::rtl::OUString aNewString;
|
||||
|
||||
// Nur Spezial-F<>lle behandeln, als Default tun wir nichts
|
||||
// only special cases are handled, nothing on default
|
||||
switch( eTargetType )
|
||||
{
|
||||
// Bei Fliesskomma International beruecksichtigen
|
||||
// consider international for floating point
|
||||
case SbxSINGLE:
|
||||
case SbxDOUBLE:
|
||||
case SbxCURRENCY:
|
||||
{
|
||||
::rtl::OString aBStr( ::rtl::OUStringToOString( rSrc, RTL_TEXTENCODING_ASCII_US ) );
|
||||
|
||||
// Komma besorgen
|
||||
sal_Unicode cDecimalSep, cThousandSep;
|
||||
ImpGetIntntlSep( cDecimalSep, cThousandSep );
|
||||
aNewString = rSrc;
|
||||
|
||||
// Ersetzen, wenn DecimalSep kein '.' (nur den ersten)
|
||||
if( cDecimalSep != (sal_Unicode)'.' )
|
||||
{
|
||||
sal_Int32 nPos = aNewString.indexOf( cDecimalSep );
|
||||
@ -456,7 +443,7 @@ sal_Bool ImpConvStringExt( ::rtl::OUString& rSrc, SbxDataType eTargetType )
|
||||
break;
|
||||
}
|
||||
|
||||
// Bei sal_Bool sal_True und sal_False als String pruefen
|
||||
// check as string in case of sal_Bool sal_True and sal_False
|
||||
case SbxBOOL:
|
||||
{
|
||||
if( rSrc.equalsIgnoreAsciiCaseAscii( "true" ) )
|
||||
@ -474,39 +461,38 @@ sal_Bool ImpConvStringExt( ::rtl::OUString& rSrc, SbxDataType eTargetType )
|
||||
}
|
||||
default: break;
|
||||
}
|
||||
// String bei Aenderung uebernehmen
|
||||
|
||||
if( bChanged )
|
||||
rSrc = aNewString;
|
||||
return bChanged;
|
||||
}
|
||||
|
||||
|
||||
// Formatierte Zahlenausgabe
|
||||
// Der Returnwert ist die Anzahl Zeichen, die aus dem
|
||||
// Format verwendt wurden.
|
||||
// formatted number output
|
||||
// the return value is the number of characters used
|
||||
// from the format
|
||||
|
||||
#ifdef _old_format_code_
|
||||
// lasse diesen Code vorl"aufig drin, zum 'abgucken'
|
||||
// der bisherigen Implementation
|
||||
// leave the code provisionally to copy the previous implementation
|
||||
|
||||
static sal_uInt16 printfmtnum( double nNum, XubString& rRes, const XubString& rWFmt )
|
||||
{
|
||||
const String& rFmt = rWFmt;
|
||||
char cFill = ' '; // Fuellzeichen
|
||||
char cPre = 0; // Startzeichen( evtl. "$" )
|
||||
short nExpDig= 0; // Anzahl Exponentstellen
|
||||
short nPrec = 0; // Anzahl Nachkommastellen
|
||||
short nWidth = 0; // Zahlenweite gesamnt
|
||||
short nLen; // Laenge konvertierte Zahl
|
||||
sal_Bool bPoint = sal_False; // sal_True: mit 1000er Kommas
|
||||
sal_Bool bTrail = sal_False; // sal_True, wenn folgendes Minus
|
||||
sal_Bool bSign = sal_False; // sal_True: immer mit Vorzeichen
|
||||
sal_Bool bNeg = sal_False; // sal_True: Zahl ist negativ
|
||||
char cBuf [1024]; // Zahlenpuffer
|
||||
char cFill = ' '; // filling characters
|
||||
char cPre = 0; // start character ( maybe "$" )
|
||||
short nExpDig= 0; // number of exponent positions
|
||||
short nPrec = 0; // number of positions after decimal point
|
||||
short nWidth = 0; // number range completely
|
||||
short nLen; // length of converted number
|
||||
sal_Bool bPoint = sal_False; // sal_True: with 1000 seperators
|
||||
sal_Bool bTrail = sal_False; // sal_True, if following minus
|
||||
sal_Bool bSign = sal_False; // sal_True: always with leading sign
|
||||
sal_Bool bNeg = sal_False; // sal_True: number is negative
|
||||
char cBuf [1024]; // number buffer
|
||||
char * p;
|
||||
const char* pFmt = rFmt;
|
||||
rRes.Erase();
|
||||
// $$ und ** abfangen. Einfach wird als Zeichen ausgegeben.
|
||||
// catch $$ and **, is simply output as character
|
||||
if( *pFmt == '$' )
|
||||
if( *++pFmt != '$' ) rRes += '$';
|
||||
if( *pFmt == '*' )
|
||||
@ -529,30 +515,30 @@ static sal_uInt16 printfmtnum( double nNum, XubString& rRes, const XubString& rW
|
||||
case ',':
|
||||
pFmt--; break;
|
||||
}
|
||||
// Vorkomma:
|
||||
// pre point
|
||||
for( ;; )
|
||||
{
|
||||
while( *pFmt == '#' ) pFmt++, nWidth++;
|
||||
// 1000er Kommas?
|
||||
// 1000 separators?
|
||||
if( *pFmt == ',' )
|
||||
{
|
||||
nWidth++; pFmt++; bPoint = sal_True;
|
||||
} else break;
|
||||
}
|
||||
// Nachkomma:
|
||||
// after point
|
||||
if( *pFmt == '.' )
|
||||
{
|
||||
while( *++pFmt == '#' ) nPrec++;
|
||||
nWidth += nPrec + 1;
|
||||
}
|
||||
// Exponent:
|
||||
// exponent
|
||||
while( *pFmt == '^' )
|
||||
pFmt++, nExpDig++, nWidth++;
|
||||
// Folgendes Minus:
|
||||
// following minus
|
||||
if( !bSign && *pFmt == '-' )
|
||||
pFmt++, bTrail = sal_True;
|
||||
|
||||
// Zahl konvertieren:
|
||||
// convert number
|
||||
if( nPrec > 15 ) nPrec = 15;
|
||||
if( nNum < 0.0 ) nNum = -nNum, bNeg = sal_True;
|
||||
p = cBuf;
|
||||
@ -560,7 +546,7 @@ static sal_uInt16 printfmtnum( double nNum, XubString& rRes, const XubString& rW
|
||||
myftoa( nNum, p, nPrec, nExpDig, bPoint, sal_False );
|
||||
nLen = strlen( cBuf );
|
||||
|
||||
// Ueberlauf?
|
||||
// overflow?
|
||||
if( cPre ) nLen++;
|
||||
if( nLen > nWidth ) rRes += '%';
|
||||
else {
|
||||
@ -849,7 +835,7 @@ void SbxValue::Format( XubString& rRes, const XubString* pFmt ) const
|
||||
case SbxULONG:
|
||||
case SbxINT:
|
||||
case SbxUINT:
|
||||
case SbxNULL: // #45929 NULL mit durchschummeln
|
||||
case SbxNULL: // #45929 NULL with a little cheating
|
||||
nComma = 0; goto cvt;
|
||||
case SbxSINGLE:
|
||||
nComma = 6; goto cvt;
|
||||
@ -860,11 +846,10 @@ void SbxValue::Format( XubString& rRes, const XubString* pFmt ) const
|
||||
if( eType != SbxNULL )
|
||||
d = GetDouble();
|
||||
|
||||
// #45355 weiterer Einsprungpunkt fuer isnumeric-String
|
||||
// #45355 another point to jump in for isnumeric-String
|
||||
cvt2:
|
||||
if( pFmt )
|
||||
{
|
||||
// hole die 'statischen' Daten f"ur Sbx
|
||||
SbxAppData* pData = GetSbxData_Impl();
|
||||
|
||||
LanguageType eLangType = GetpApp()->GetSettings().GetLanguage();
|
||||
@ -878,8 +863,7 @@ void SbxValue::Format( XubString& rRes, const XubString* pFmt ) const
|
||||
}
|
||||
pData->eBasicFormaterLangType = eLangType;
|
||||
|
||||
// falls bisher noch kein BasicFormater-Objekt
|
||||
// existiert, so erzeuge dieses
|
||||
|
||||
if( !pData->pBasicFormater )
|
||||
{
|
||||
SvtSysLocale aSysLocale;
|
||||
@ -888,9 +872,9 @@ void SbxValue::Format( XubString& rRes, const XubString* pFmt ) const
|
||||
sal_Unicode c1000 = rData.getNumThousandSep().GetBuffer()[0];
|
||||
String aCurrencyStrg = rData.getCurrSymbol();
|
||||
|
||||
// Initialisierung des Basic-Formater-Hilfsobjekts:
|
||||
// hole die Resourcen f"ur die vordefinierten Ausgaben
|
||||
// des Format()-Befehls, z.B. f"ur "On/Off".
|
||||
// initialize the Basic-formater help object:
|
||||
// get resources for predefined output
|
||||
// of the Format()-command, e. g. for "On/Off"
|
||||
String aOnStrg = String( SbxValueFormatResId(
|
||||
STR_BASICKEY_FORMAT_ON ) );
|
||||
String aOffStrg = String( SbxValueFormatResId(
|
||||
@ -905,22 +889,22 @@ void SbxValue::Format( XubString& rRes, const XubString* pFmt ) const
|
||||
STR_BASICKEY_FORMAT_FALSE) );
|
||||
String aCurrencyFormatStrg = String( SbxValueFormatResId(
|
||||
STR_BASICKEY_FORMAT_CURRENCY) );
|
||||
// erzeuge das Basic-Formater-Objekt
|
||||
|
||||
pData->pBasicFormater
|
||||
= new SbxBasicFormater( cComma,c1000,aOnStrg,aOffStrg,
|
||||
aYesStrg,aNoStrg,aTrueStrg,aFalseStrg,
|
||||
aCurrencyStrg,aCurrencyFormatStrg );
|
||||
}
|
||||
// Bem.: Aus Performance-Gr"unden wird nur EIN BasicFormater-
|
||||
// Objekt erzeugt und 'gespeichert', dadurch erspart man
|
||||
// sich das teure Resourcen-Laden (f"ur landesspezifische
|
||||
// vordefinierte Ausgaben, z.B. "On/Off") und die st"andige
|
||||
// String-Erzeugungs Operationen.
|
||||
// ABER: dadurch ist dieser Code NICHT multithreading f"ahig !
|
||||
// Remark: For performance reasons there's only ONE BasicFormater-
|
||||
// object created and 'stored', so that the expensive resource-
|
||||
// loading is saved (for country-specific predefined outputs,
|
||||
// e. g. "On/Off") and the continous string-creation
|
||||
// operations, too.
|
||||
// BUT: therefore this code is NOT multithreading capable!
|
||||
|
||||
// hier gibt es Probleme mit ;;;Null, da diese Methode nur aufgerufen
|
||||
// wird, wenn der SbxValue eine Zahl ist !!!
|
||||
// dazu koennte: pData->pBasicFormater->BasicFormatNull( *pFmt ); aufgerufen werden !
|
||||
// here are problems with ;;;Null because this method is only
|
||||
// called, if SbxValue is a number!!!
|
||||
// in addition pData->pBasicFormater->BasicFormatNull( *pFmt ); could be called!
|
||||
if( eType != SbxNULL )
|
||||
{
|
||||
rRes = pData->pBasicFormater->BasicFormat( d ,*pFmt );
|
||||
@ -941,7 +925,7 @@ void SbxValue::Format( XubString& rRes, const XubString* pFmt ) const
|
||||
case SbxSTRING:
|
||||
if( pFmt )
|
||||
{
|
||||
// #45355 wenn es numerisch ist, muss gewandelt werden
|
||||
// #45355 converting if numeric
|
||||
if( IsNumericRTL() )
|
||||
{
|
||||
ScanNumIntnl( GetString(), d, /*bSingle*/sal_False );
|
||||
@ -949,7 +933,6 @@ void SbxValue::Format( XubString& rRes, const XubString* pFmt ) const
|
||||
}
|
||||
else
|
||||
{
|
||||
// Sonst String-Formatierung
|
||||
printfmtstr( GetString(), rRes, *pFmt );
|
||||
}
|
||||
}
|
||||
|
@ -327,7 +327,7 @@ IMPL_LINK( TestWindow, TBSelect, ToolBox *, p )
|
||||
{
|
||||
if ( pBasMgr )
|
||||
{
|
||||
// liegt in einem anderen Storage !!!
|
||||
// is in another storage!!!
|
||||
sal_uInt16 nLib = pBasMgr->GetLibId( pBasMgr->CreateLib( pLib3Str ) );
|
||||
if ( nLib != LIB_NOTFOUND )
|
||||
{
|
||||
@ -366,7 +366,7 @@ IMPL_LINK( TestWindow, TBSelect, ToolBox *, p )
|
||||
{
|
||||
if ( pBasMgr )
|
||||
{
|
||||
// liegt in einem anderen Storage !!!
|
||||
// is in another storage!!!
|
||||
SvStorageRef xStorage = new SvStorage( "d:\\mystore2.svs" );
|
||||
if ( !pBasMgr->AddLib( *xStorage, pLib3Str, sal_False ) )
|
||||
Sound::Beep();
|
||||
@ -528,7 +528,7 @@ void __EXPORT TestWindow::KeyInput( const KeyEvent& rKEvt )
|
||||
{
|
||||
sal_uInt16 nCode = rKEvt.GetKeyCode().GetCode();
|
||||
|
||||
// Nur bei Alt-Return
|
||||
// only for Alt-Return
|
||||
if ( ( nCode == KEY_RETURN ) && rKEvt.GetKeyCode().IsMod2() )
|
||||
;
|
||||
else
|
||||
|
Loading…
x
Reference in New Issue
Block a user