1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski *
3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file
5*b1cdbd2cSJim Jagielski * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file
7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski *
11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski *
13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the
17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski * under the License.
19*b1cdbd2cSJim Jagielski *
20*b1cdbd2cSJim Jagielski *************************************************************/
21*b1cdbd2cSJim Jagielski
22*b1cdbd2cSJim Jagielski
23*b1cdbd2cSJim Jagielski
24*b1cdbd2cSJim Jagielski #ifndef _SBRUNTIME_HXX
25*b1cdbd2cSJim Jagielski #define _SBRUNTIME_HXX
26*b1cdbd2cSJim Jagielski
27*b1cdbd2cSJim Jagielski #ifndef _SBX_HXX
28*b1cdbd2cSJim Jagielski #include <basic/sbx.hxx>
29*b1cdbd2cSJim Jagielski #endif
30*b1cdbd2cSJim Jagielski
31*b1cdbd2cSJim Jagielski #include "sb.hxx"
32*b1cdbd2cSJim Jagielski
33*b1cdbd2cSJim Jagielski // Define activates class UCBStream in iosys.cxx
34*b1cdbd2cSJim Jagielski #define _USE_UNO
35*b1cdbd2cSJim Jagielski
36*b1cdbd2cSJim Jagielski #ifdef _USE_UNO
37*b1cdbd2cSJim Jagielski #include <rtl/ustring.hxx>
38*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/Sequence.hxx>
39*b1cdbd2cSJim Jagielski #include <osl/file.hxx>
40*b1cdbd2cSJim Jagielski #include <rtl/math.hxx>
41*b1cdbd2cSJim Jagielski #include <i18npool/lang.h>
42*b1cdbd2cSJim Jagielski
43*b1cdbd2cSJim Jagielski #include <vector>
44*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XComponent.hpp>
45*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XEnumeration.hpp>
46*b1cdbd2cSJim Jagielski #include <unotools/localedatawrapper.hxx>
47*b1cdbd2cSJim Jagielski
48*b1cdbd2cSJim Jagielski using namespace com::sun::star::uno;
49*b1cdbd2cSJim Jagielski using namespace com::sun::star::lang;
50*b1cdbd2cSJim Jagielski using namespace com::sun::star::container;
51*b1cdbd2cSJim Jagielski
52*b1cdbd2cSJim Jagielski
53*b1cdbd2cSJim Jagielski // Define activates old file implementation
54*b1cdbd2cSJim Jagielski // (only in non UCB case)
55*b1cdbd2cSJim Jagielski // #define _OLD_FILE_IMPL
56*b1cdbd2cSJim Jagielski
57*b1cdbd2cSJim Jagielski
58*b1cdbd2cSJim Jagielski //#include <sal/types.h>
59*b1cdbd2cSJim Jagielski //#include <rtl/byteseq.hxx>
60*b1cdbd2cSJim Jagielski //#include <rtl/ustring>
61*b1cdbd2cSJim Jagielski
62*b1cdbd2cSJim Jagielski
63*b1cdbd2cSJim Jagielski namespace basicEncoder
64*b1cdbd2cSJim Jagielski {
65*b1cdbd2cSJim Jagielski
66*b1cdbd2cSJim Jagielski // TODO: Use exported functionality (code is copied from deamons2/ucb)
67*b1cdbd2cSJim Jagielski class AsciiEncoder
68*b1cdbd2cSJim Jagielski {
69*b1cdbd2cSJim Jagielski public:
70*b1cdbd2cSJim Jagielski static ::rtl::OUString decodeUnoUrlParamValue(const rtl::OUString & rSource);
71*b1cdbd2cSJim Jagielski //static ::rtl::OUString encodeUnoUrlParamValue(const rtl::OUString & rSource);
72*b1cdbd2cSJim Jagielski //static ::rtl::ByteSequence decode(const ::rtl::OUString & string);
73*b1cdbd2cSJim Jagielski //static ::rtl::OUString encode(const ::rtl::ByteSequence & bytes);
74*b1cdbd2cSJim Jagielski //static void test();
75*b1cdbd2cSJim Jagielski };
76*b1cdbd2cSJim Jagielski
77*b1cdbd2cSJim Jagielski }
78*b1cdbd2cSJim Jagielski
79*b1cdbd2cSJim Jagielski #endif /* _USE_UNO */
80*b1cdbd2cSJim Jagielski
81*b1cdbd2cSJim Jagielski class SbiInstance; // aktiver StarBASIC-Prozess
82*b1cdbd2cSJim Jagielski class SbiRuntime; // aktive StarBASIC-Prozedur-Instanz
83*b1cdbd2cSJim Jagielski
84*b1cdbd2cSJim Jagielski struct SbiArgvStack; // Argv stack element
85*b1cdbd2cSJim Jagielski struct SbiGosubStack; // GOSUB stack element
86*b1cdbd2cSJim Jagielski class SbiImage; // Code-Image
87*b1cdbd2cSJim Jagielski class SbiIoSystem; // Dateisystem
88*b1cdbd2cSJim Jagielski class SbiDdeControl; // DDE-Steuerung
89*b1cdbd2cSJim Jagielski class SbiDllMgr; // Aufrufe in DLLs
90*b1cdbd2cSJim Jagielski class SvNumberFormatter; // Zeit/Datumsfunktionen
91*b1cdbd2cSJim Jagielski
92*b1cdbd2cSJim Jagielski enum ForType
93*b1cdbd2cSJim Jagielski {
94*b1cdbd2cSJim Jagielski FOR_TO,
95*b1cdbd2cSJim Jagielski FOR_EACH_ARRAY,
96*b1cdbd2cSJim Jagielski FOR_EACH_COLLECTION,
97*b1cdbd2cSJim Jagielski FOR_EACH_XENUMERATION
98*b1cdbd2cSJim Jagielski };
99*b1cdbd2cSJim Jagielski
100*b1cdbd2cSJim Jagielski struct SbiForStack { // for/next stack:
101*b1cdbd2cSJim Jagielski SbiForStack* pNext; // Chain
102*b1cdbd2cSJim Jagielski SbxVariableRef refVar; // loop variable
103*b1cdbd2cSJim Jagielski SbxVariableRef refEnd; // end expression / for each: Array/BasicCollection object
104*b1cdbd2cSJim Jagielski SbxVariableRef refInc; // increment expression
105*b1cdbd2cSJim Jagielski
106*b1cdbd2cSJim Jagielski // For each support
107*b1cdbd2cSJim Jagielski ForType eForType;
108*b1cdbd2cSJim Jagielski sal_Int32 nCurCollectionIndex;
109*b1cdbd2cSJim Jagielski sal_Int32* pArrayCurIndices;
110*b1cdbd2cSJim Jagielski sal_Int32* pArrayLowerBounds;
111*b1cdbd2cSJim Jagielski sal_Int32* pArrayUpperBounds;
112*b1cdbd2cSJim Jagielski Reference< XEnumeration > xEnumeration;
113*b1cdbd2cSJim Jagielski
SbiForStackSbiForStack114*b1cdbd2cSJim Jagielski SbiForStack( void )
115*b1cdbd2cSJim Jagielski : pArrayCurIndices( NULL )
116*b1cdbd2cSJim Jagielski , pArrayLowerBounds( NULL )
117*b1cdbd2cSJim Jagielski , pArrayUpperBounds( NULL )
118*b1cdbd2cSJim Jagielski {}
~SbiForStackSbiForStack119*b1cdbd2cSJim Jagielski ~SbiForStack()
120*b1cdbd2cSJim Jagielski {
121*b1cdbd2cSJim Jagielski delete[] pArrayCurIndices;
122*b1cdbd2cSJim Jagielski delete[] pArrayLowerBounds;
123*b1cdbd2cSJim Jagielski delete[] pArrayUpperBounds;
124*b1cdbd2cSJim Jagielski }
125*b1cdbd2cSJim Jagielski };
126*b1cdbd2cSJim Jagielski
127*b1cdbd2cSJim Jagielski struct SbiGosubStack { // GOSUB-Stack:
128*b1cdbd2cSJim Jagielski SbiGosubStack* pNext; // Chain
129*b1cdbd2cSJim Jagielski const sal_uInt8* pCode; // Return-Pointer
130*b1cdbd2cSJim Jagielski sal_uInt16 nStartForLvl; // #118235: For Level in moment of gosub
131*b1cdbd2cSJim Jagielski };
132*b1cdbd2cSJim Jagielski
133*b1cdbd2cSJim Jagielski #define MAXRECURSION 500 // max. 500 Rekursionen
134*b1cdbd2cSJim Jagielski
135*b1cdbd2cSJim Jagielski #define Sb_ATTR_NORMAL 0x0000
136*b1cdbd2cSJim Jagielski #define Sb_ATTR_HIDDEN 0x0002
137*b1cdbd2cSJim Jagielski #define Sb_ATTR_SYSTEM 0x0004
138*b1cdbd2cSJim Jagielski #define Sb_ATTR_VOLUME 0x0008
139*b1cdbd2cSJim Jagielski #define Sb_ATTR_DIRECTORY 0x0010
140*b1cdbd2cSJim Jagielski #define Sb_ATTR_ARCHIVE 0x0020
141*b1cdbd2cSJim Jagielski
142*b1cdbd2cSJim Jagielski
143*b1cdbd2cSJim Jagielski class Dir;
144*b1cdbd2cSJim Jagielski class WildCard;
145*b1cdbd2cSJim Jagielski
146*b1cdbd2cSJim Jagielski class SbiRTLData
147*b1cdbd2cSJim Jagielski {
148*b1cdbd2cSJim Jagielski public:
149*b1cdbd2cSJim Jagielski
150*b1cdbd2cSJim Jagielski #ifdef _OLD_FILE_IMPL
151*b1cdbd2cSJim Jagielski Dir* pDir;
152*b1cdbd2cSJim Jagielski #else
153*b1cdbd2cSJim Jagielski ::osl::Directory* pDir;
154*b1cdbd2cSJim Jagielski #endif
155*b1cdbd2cSJim Jagielski sal_Int16 nDirFlags;
156*b1cdbd2cSJim Jagielski short nCurDirPos;
157*b1cdbd2cSJim Jagielski
158*b1cdbd2cSJim Jagielski String sFullNameToBeChecked;
159*b1cdbd2cSJim Jagielski WildCard* pWildCard;
160*b1cdbd2cSJim Jagielski
161*b1cdbd2cSJim Jagielski #ifdef _USE_UNO
162*b1cdbd2cSJim Jagielski Sequence< ::rtl::OUString > aDirSeq;
163*b1cdbd2cSJim Jagielski #endif /* _USE_UNO */
164*b1cdbd2cSJim Jagielski
165*b1cdbd2cSJim Jagielski SbiRTLData();
166*b1cdbd2cSJim Jagielski ~SbiRTLData();
167*b1cdbd2cSJim Jagielski };
168*b1cdbd2cSJim Jagielski
169*b1cdbd2cSJim Jagielski // Die Instanz entspricht einem laufenden StarBASIC. Mehrere gleichzeitig
170*b1cdbd2cSJim Jagielski // laufende BASICs werden ueber verkettete Instanzen verwaltet. Hier liegen
171*b1cdbd2cSJim Jagielski // alle Daten, die nur leben, wenn BASIC auch lebt, wie z.B. das I/O-System.
172*b1cdbd2cSJim Jagielski
173*b1cdbd2cSJim Jagielski typedef ::std::vector
174*b1cdbd2cSJim Jagielski <
175*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent >
176*b1cdbd2cSJim Jagielski >
177*b1cdbd2cSJim Jagielski ComponentVector_t;
178*b1cdbd2cSJim Jagielski
179*b1cdbd2cSJim Jagielski
180*b1cdbd2cSJim Jagielski class SbiInstance
181*b1cdbd2cSJim Jagielski {
182*b1cdbd2cSJim Jagielski friend class SbiRuntime;
183*b1cdbd2cSJim Jagielski
184*b1cdbd2cSJim Jagielski SbiRTLData aRTLData;
185*b1cdbd2cSJim Jagielski
186*b1cdbd2cSJim Jagielski SbiIoSystem* pIosys; // Dateisystem
187*b1cdbd2cSJim Jagielski SbiDdeControl* pDdeCtrl; // DDE
188*b1cdbd2cSJim Jagielski SbiDllMgr* pDllMgr; // DLL-Calls (DECLARE)
189*b1cdbd2cSJim Jagielski StarBASIC* pBasic;
190*b1cdbd2cSJim Jagielski SvNumberFormatter* pNumberFormatter;
191*b1cdbd2cSJim Jagielski LanguageType meFormatterLangType;
192*b1cdbd2cSJim Jagielski DateFormat meFormatterDateFormat;
193*b1cdbd2cSJim Jagielski sal_uInt32 nStdDateIdx, nStdTimeIdx, nStdDateTimeIdx;
194*b1cdbd2cSJim Jagielski
195*b1cdbd2cSJim Jagielski SbError nErr; // aktueller Fehlercode
196*b1cdbd2cSJim Jagielski String aErrorMsg; // letzte Error-Message fuer $ARG
197*b1cdbd2cSJim Jagielski sal_uInt16 nErl; // aktuelle Fehlerzeile
198*b1cdbd2cSJim Jagielski sal_Bool bReschedule; // Flag: sal_True = Reschedule in Hauptschleife
199*b1cdbd2cSJim Jagielski sal_Bool bCompatibility; // Flag: sal_True = VBA runtime compatibility mode
200*b1cdbd2cSJim Jagielski
201*b1cdbd2cSJim Jagielski ComponentVector_t ComponentVector;
202*b1cdbd2cSJim Jagielski
203*b1cdbd2cSJim Jagielski public:
204*b1cdbd2cSJim Jagielski SbiRuntime* pRun; // Call-Stack
205*b1cdbd2cSJim Jagielski SbiInstance* pNext; // Instanzen-Chain
206*b1cdbd2cSJim Jagielski
207*b1cdbd2cSJim Jagielski // #31460 Neues Konzept fuer StepInto/Over/Out,
208*b1cdbd2cSJim Jagielski // Erklaerung siehe runtime.cxx bei SbiInstance::CalcBreakCallLevel()
209*b1cdbd2cSJim Jagielski sal_uInt16 nCallLvl; // Call-Level (wg. Rekursion)
210*b1cdbd2cSJim Jagielski sal_uInt16 nBreakCallLvl; // Call-Level zum Anhalten
211*b1cdbd2cSJim Jagielski void CalcBreakCallLevel( sal_uInt16 nFlags ); // Gemaess Flags setzen
212*b1cdbd2cSJim Jagielski
213*b1cdbd2cSJim Jagielski SbiInstance( StarBASIC* );
214*b1cdbd2cSJim Jagielski ~SbiInstance();
215*b1cdbd2cSJim Jagielski
216*b1cdbd2cSJim Jagielski void Error( SbError ); // trappable Error
217*b1cdbd2cSJim Jagielski void Error( SbError, const String& rMsg ); // trappable Error mit Message
218*b1cdbd2cSJim Jagielski void ErrorVB( sal_Int32 nVBNumber, const String& rMsg );
219*b1cdbd2cSJim Jagielski void setErrorVB( sal_Int32 nVBNumber, const String& rMsg );
220*b1cdbd2cSJim Jagielski void FatalError( SbError ); // non-trappable Error
221*b1cdbd2cSJim Jagielski void FatalError( SbError, const String& ); // non-trappable Error
222*b1cdbd2cSJim Jagielski void Abort(); // Abbruch mit aktuellem Fehlercode
223*b1cdbd2cSJim Jagielski
224*b1cdbd2cSJim Jagielski void Stop();
GetErr()225*b1cdbd2cSJim Jagielski SbError GetErr() { return nErr; }
GetErrorMsg()226*b1cdbd2cSJim Jagielski String GetErrorMsg() { return aErrorMsg; }
GetErl()227*b1cdbd2cSJim Jagielski xub_StrLen GetErl() { return nErl; }
EnableReschedule(sal_Bool bEnable)228*b1cdbd2cSJim Jagielski void EnableReschedule( sal_Bool bEnable ) { bReschedule = bEnable; }
IsReschedule(void)229*b1cdbd2cSJim Jagielski sal_Bool IsReschedule( void ) { return bReschedule; }
EnableCompatibility(sal_Bool bEnable)230*b1cdbd2cSJim Jagielski void EnableCompatibility( sal_Bool bEnable ) { bCompatibility = bEnable; }
IsCompatibility(void)231*b1cdbd2cSJim Jagielski sal_Bool IsCompatibility( void ) { return bCompatibility; }
232*b1cdbd2cSJim Jagielski
getComponentVector(void)233*b1cdbd2cSJim Jagielski ComponentVector_t& getComponentVector( void ) { return ComponentVector; }
234*b1cdbd2cSJim Jagielski
235*b1cdbd2cSJim Jagielski SbMethod* GetCaller( sal_uInt16 );
236*b1cdbd2cSJim Jagielski SbModule* GetActiveModule();
237*b1cdbd2cSJim Jagielski SbxArray* GetLocals( SbMethod* );
238*b1cdbd2cSJim Jagielski
GetIoSystem()239*b1cdbd2cSJim Jagielski SbiIoSystem* GetIoSystem() { return pIosys; }
GetDdeControl()240*b1cdbd2cSJim Jagielski SbiDdeControl* GetDdeControl() { return pDdeCtrl; }
GetBasic(void)241*b1cdbd2cSJim Jagielski StarBASIC* GetBasic( void ) { return pBasic; }
242*b1cdbd2cSJim Jagielski SbiDllMgr* GetDllMgr();
GetRTLData() const243*b1cdbd2cSJim Jagielski SbiRTLData* GetRTLData() const { return (SbiRTLData*)&aRTLData; }
244*b1cdbd2cSJim Jagielski
245*b1cdbd2cSJim Jagielski SvNumberFormatter* GetNumberFormatter();
GetStdDateIdx() const246*b1cdbd2cSJim Jagielski sal_uInt32 GetStdDateIdx() const { return nStdDateIdx; }
GetStdTimeIdx() const247*b1cdbd2cSJim Jagielski sal_uInt32 GetStdTimeIdx() const { return nStdTimeIdx; }
GetStdDateTimeIdx() const248*b1cdbd2cSJim Jagielski sal_uInt32 GetStdDateTimeIdx() const { return nStdDateTimeIdx; }
249*b1cdbd2cSJim Jagielski
250*b1cdbd2cSJim Jagielski // #39629# NumberFormatter auch statisch anbieten
251*b1cdbd2cSJim Jagielski static void PrepareNumberFormatter( SvNumberFormatter*& rpNumberFormatter,
252*b1cdbd2cSJim Jagielski sal_uInt32 &rnStdDateIdx, sal_uInt32 &rnStdTimeIdx, sal_uInt32 &rnStdDateTimeIdx,
253*b1cdbd2cSJim Jagielski LanguageType* peFormatterLangType=NULL, DateFormat* peFormatterDateFormat=NULL );
254*b1cdbd2cSJim Jagielski };
255*b1cdbd2cSJim Jagielski
256*b1cdbd2cSJim Jagielski SbiIoSystem* SbGetIoSystem(); // das aktuelle I/O-System
257*b1cdbd2cSJim Jagielski
258*b1cdbd2cSJim Jagielski
259*b1cdbd2cSJim Jagielski // Verkettbare Items, um Referenzen temporaer zu halten
260*b1cdbd2cSJim Jagielski struct RefSaveItem
261*b1cdbd2cSJim Jagielski {
262*b1cdbd2cSJim Jagielski SbxVariableRef xRef;
263*b1cdbd2cSJim Jagielski RefSaveItem* pNext;
264*b1cdbd2cSJim Jagielski
RefSaveItemRefSaveItem265*b1cdbd2cSJim Jagielski RefSaveItem() { pNext = NULL; }
266*b1cdbd2cSJim Jagielski };
267*b1cdbd2cSJim Jagielski
268*b1cdbd2cSJim Jagielski
269*b1cdbd2cSJim Jagielski // Eine Instanz dieser Klasse wird fuer jedes ausgefuehrte Unterprogramm
270*b1cdbd2cSJim Jagielski // aufgesetzt. Diese Instanz ist das Herz der BASIC-Maschine und enthaelt
271*b1cdbd2cSJim Jagielski // nur lokale Daten.
272*b1cdbd2cSJim Jagielski
273*b1cdbd2cSJim Jagielski class SbiRuntime
274*b1cdbd2cSJim Jagielski {
275*b1cdbd2cSJim Jagielski friend void SbRtl_CallByName( StarBASIC* pBasic, SbxArray& rPar, sal_Bool bWrite );
276*b1cdbd2cSJim Jagielski
277*b1cdbd2cSJim Jagielski typedef void( SbiRuntime::*pStep0 )();
278*b1cdbd2cSJim Jagielski typedef void( SbiRuntime::*pStep1 )( sal_uInt32 nOp1 );
279*b1cdbd2cSJim Jagielski typedef void( SbiRuntime::*pStep2 )( sal_uInt32 nOp1, sal_uInt32 nOp2 );
280*b1cdbd2cSJim Jagielski static pStep0 aStep0[]; // Opcode-Tabelle Gruppe 0
281*b1cdbd2cSJim Jagielski static pStep1 aStep1[]; // Opcode-Tabelle Gruppe 1
282*b1cdbd2cSJim Jagielski static pStep2 aStep2[]; // Opcode-Tabelle Gruppe 2
283*b1cdbd2cSJim Jagielski
284*b1cdbd2cSJim Jagielski StarBASIC& rBasic; // StarBASIC-Instanz
285*b1cdbd2cSJim Jagielski SbiInstance* pInst; // aktiver Thread
286*b1cdbd2cSJim Jagielski SbModule* pMod; // aktuelles Modul
287*b1cdbd2cSJim Jagielski SbMethod* pMeth; // Methoden-Instanz
288*b1cdbd2cSJim Jagielski SbiIoSystem* pIosys; // I/O-System
289*b1cdbd2cSJim Jagielski const SbiImage* pImg; // Code-Image
290*b1cdbd2cSJim Jagielski SbxArrayRef refExprStk; // expression stack
291*b1cdbd2cSJim Jagielski SbxArrayRef refCaseStk; // CASE expression stack
292*b1cdbd2cSJim Jagielski SbxArrayRef refRedimpArray; // Array saved to use for REDIM PRESERVE
293*b1cdbd2cSJim Jagielski SbxVariableRef xDummyVar; // Ersatz fuer nicht gefundene Variablen
294*b1cdbd2cSJim Jagielski SbiArgvStack* pArgvStk; // ARGV-Stack
295*b1cdbd2cSJim Jagielski SbiGosubStack* pGosubStk; // GOSUB stack
296*b1cdbd2cSJim Jagielski SbiForStack* pForStk; // FOR/NEXT-Stack
297*b1cdbd2cSJim Jagielski sal_uInt16 nExprLvl; // Tiefe des Expr-Stacks
298*b1cdbd2cSJim Jagielski sal_uInt16 nGosubLvl; // Zum Vermeiden von Tot-Rekursionen
299*b1cdbd2cSJim Jagielski sal_uInt16 nForLvl; // #118235: Maintain for level
300*b1cdbd2cSJim Jagielski const sal_uInt8* pCode; // aktueller Code-Pointer
301*b1cdbd2cSJim Jagielski const sal_uInt8* pStmnt; // Beginn des lezten Statements
302*b1cdbd2cSJim Jagielski const sal_uInt8* pError; // Adresse des aktuellen Error-Handlers
303*b1cdbd2cSJim Jagielski const sal_uInt8* pRestart; // Restart-Adresse
304*b1cdbd2cSJim Jagielski const sal_uInt8* pErrCode; // Restart-Adresse RESUME NEXT
305*b1cdbd2cSJim Jagielski const sal_uInt8* pErrStmnt; // Restart-Adresse RESUMT 0
306*b1cdbd2cSJim Jagielski String aLibName; // Lib-Name fuer Declare-Call
307*b1cdbd2cSJim Jagielski SbxArrayRef refParams; // aktuelle Prozedur-Parameter
308*b1cdbd2cSJim Jagielski SbxArrayRef refLocals; // lokale Variable
309*b1cdbd2cSJim Jagielski SbxArrayRef refArgv; // aktueller Argv
310*b1cdbd2cSJim Jagielski // AB, 28.3.2000 #74254, Ein refSaveObj reicht nicht! Neu: pRefSaveList (s.u.)
311*b1cdbd2cSJim Jagielski //SbxVariableRef refSaveObj; // #56368 Bei StepElem Referenz sichern
312*b1cdbd2cSJim Jagielski short nArgc; // aktueller Argc
313*b1cdbd2cSJim Jagielski sal_Bool bRun; // sal_True: Programm ist aktiv
314*b1cdbd2cSJim Jagielski sal_Bool bError; // sal_True: Fehler behandeln
315*b1cdbd2cSJim Jagielski sal_Bool bInError; // sal_True: in einem Fehler-Handler
316*b1cdbd2cSJim Jagielski sal_Bool bBlocked; // sal_True: blocked by next call level, #i48868
317*b1cdbd2cSJim Jagielski sal_Bool bVBAEnabled;
318*b1cdbd2cSJim Jagielski sal_uInt16 nFlags; // Debugging-Flags
319*b1cdbd2cSJim Jagielski SbError nError; // letzter Fehler
320*b1cdbd2cSJim Jagielski sal_uInt16 nOps; // Opcode-Zaehler
321*b1cdbd2cSJim Jagielski sal_uInt32 m_nLastTime;
322*b1cdbd2cSJim Jagielski
323*b1cdbd2cSJim Jagielski RefSaveItem* pRefSaveList; // #74254 Temporaere Referenzen sichern
324*b1cdbd2cSJim Jagielski RefSaveItem* pItemStoreList; // Unbenutzte Items aufbewahren
SaveRef(SbxVariable * pVar)325*b1cdbd2cSJim Jagielski void SaveRef( SbxVariable* pVar )
326*b1cdbd2cSJim Jagielski {
327*b1cdbd2cSJim Jagielski RefSaveItem* pItem = pItemStoreList;
328*b1cdbd2cSJim Jagielski if( pItem )
329*b1cdbd2cSJim Jagielski pItemStoreList = pItem->pNext;
330*b1cdbd2cSJim Jagielski else
331*b1cdbd2cSJim Jagielski pItem = new RefSaveItem();
332*b1cdbd2cSJim Jagielski pItem->pNext = pRefSaveList;
333*b1cdbd2cSJim Jagielski pItem->xRef = pVar;
334*b1cdbd2cSJim Jagielski pRefSaveList = pItem;
335*b1cdbd2cSJim Jagielski }
ClearRefs(void)336*b1cdbd2cSJim Jagielski void ClearRefs( void )
337*b1cdbd2cSJim Jagielski {
338*b1cdbd2cSJim Jagielski while( pRefSaveList )
339*b1cdbd2cSJim Jagielski {
340*b1cdbd2cSJim Jagielski RefSaveItem* pToClearItem = pRefSaveList;
341*b1cdbd2cSJim Jagielski pRefSaveList = pToClearItem->pNext;
342*b1cdbd2cSJim Jagielski pToClearItem->xRef = NULL;
343*b1cdbd2cSJim Jagielski pToClearItem->pNext = pItemStoreList;
344*b1cdbd2cSJim Jagielski pItemStoreList = pToClearItem;
345*b1cdbd2cSJim Jagielski }
346*b1cdbd2cSJim Jagielski }
347*b1cdbd2cSJim Jagielski
348*b1cdbd2cSJim Jagielski SbxVariable* FindElement
349*b1cdbd2cSJim Jagielski ( SbxObject* pObj, sal_uInt32 nOp1, sal_uInt32 nOp2, SbError, sal_Bool bLocal, sal_Bool bStatic = sal_False );
350*b1cdbd2cSJim Jagielski void SetupArgs( SbxVariable*, sal_uInt32 );
351*b1cdbd2cSJim Jagielski SbxVariable* CheckArray( SbxVariable* );
352*b1cdbd2cSJim Jagielski
353*b1cdbd2cSJim Jagielski void PushVar( SbxVariable* ); // Variable push
354*b1cdbd2cSJim Jagielski SbxVariableRef PopVar(); // Variable pop
355*b1cdbd2cSJim Jagielski SbxVariable* GetTOS( short=0 ); // Variable vom TOS holen
356*b1cdbd2cSJim Jagielski void TOSMakeTemp(); // TOS in temp. Variable wandeln
357*b1cdbd2cSJim Jagielski sal_Bool ClearExprStack(); // Expr-Stack freigeben
358*b1cdbd2cSJim Jagielski
359*b1cdbd2cSJim Jagielski void PushGosub( const sal_uInt8* ); // GOSUB-Element push
360*b1cdbd2cSJim Jagielski void PopGosub(); // GOSUB-Element pop
361*b1cdbd2cSJim Jagielski void ClearGosubStack(); // GOSUB-Stack freigeben
362*b1cdbd2cSJim Jagielski
363*b1cdbd2cSJim Jagielski void PushArgv(); // Argv-Element push
364*b1cdbd2cSJim Jagielski void PopArgv(); // Argv-Element pop
365*b1cdbd2cSJim Jagielski void ClearArgvStack(); // Argv-Stack freigeben
366*b1cdbd2cSJim Jagielski
367*b1cdbd2cSJim Jagielski void PushFor(); // For-Element push
368*b1cdbd2cSJim Jagielski void PushForEach(); // For-Each-Element push
369*b1cdbd2cSJim Jagielski void PopFor(); // For-Element pop
370*b1cdbd2cSJim Jagielski void ClearForStack(); // For-Stack freigeben
371*b1cdbd2cSJim Jagielski
372*b1cdbd2cSJim Jagielski void StepArith( SbxOperator ); // arithmetische Verknuepfungen
373*b1cdbd2cSJim Jagielski void StepUnary( SbxOperator ); // unaere Verknuepfungen
374*b1cdbd2cSJim Jagielski void StepCompare( SbxOperator );// Vergleiche
375*b1cdbd2cSJim Jagielski
376*b1cdbd2cSJim Jagielski void SetParameters( SbxArray* );// Parameter uebernehmen
377*b1cdbd2cSJim Jagielski
378*b1cdbd2cSJim Jagielski // MUSS NOCH IMPLEMENTIERT WERDEN
379*b1cdbd2cSJim Jagielski void DllCall( const String&, const String&, SbxArray*, SbxDataType, sal_Bool );
380*b1cdbd2cSJim Jagielski
381*b1cdbd2cSJim Jagielski // #56204 DIM-Funktionalitaet in Hilfsmethode auslagern (step0.cxx)
382*b1cdbd2cSJim Jagielski void DimImpl( SbxVariableRef refVar );
383*b1cdbd2cSJim Jagielski
384*b1cdbd2cSJim Jagielski // #115829
385*b1cdbd2cSJim Jagielski bool implIsClass( SbxObject* pObj, const String& aClass );
386*b1cdbd2cSJim Jagielski
387*b1cdbd2cSJim Jagielski void StepSETCLASS_impl( sal_uInt32 nOp1, bool bHandleDflt = false );
388*b1cdbd2cSJim Jagielski
389*b1cdbd2cSJim Jagielski // Die nachfolgenden Routinen werden vom Single Stepper
390*b1cdbd2cSJim Jagielski // gerufen und implementieren die einzelnen Opcodes
391*b1cdbd2cSJim Jagielski void StepNOP(), StepEXP(), StepMUL(), StepDIV();
392*b1cdbd2cSJim Jagielski void StepMOD(), StepPLUS(), StepMINUS(), StepNEG();
393*b1cdbd2cSJim Jagielski void StepEQ(), StepNE(), StepLT(), StepGT();
394*b1cdbd2cSJim Jagielski void StepLE(), StepGE(), StepIDIV(), StepAND();
395*b1cdbd2cSJim Jagielski void StepOR(), StepXOR(), StepEQV(), StepIMP();
396*b1cdbd2cSJim Jagielski void StepNOT(), StepCAT(), StepLIKE(), StepIS();
397*b1cdbd2cSJim Jagielski void StepCLONE(), StepOLDBASED(), StepARGC();
398*b1cdbd2cSJim Jagielski void StepARGV(), StepINPUT(), StepLINPUT(), StepSTOP();
399*b1cdbd2cSJim Jagielski void StepGET(), StepSET(), StepVBASET(), StepPUT(), StepPUTC();
400*b1cdbd2cSJim Jagielski void StepSET_Impl( SbxVariableRef& refVal, SbxVariableRef& refVar, bool bDefaultHandling = false );
401*b1cdbd2cSJim Jagielski void StepDIM(), StepREDIM(), StepREDIMP(), StepERASE();
402*b1cdbd2cSJim Jagielski void StepINITFOR(), StepNEXT(), StepERROR(), StepINITFOREACH();
403*b1cdbd2cSJim Jagielski void StepCASE(), StepENDCASE(), StepSTDERROR();
404*b1cdbd2cSJim Jagielski void StepNOERROR(), StepCHANNEL(), StepCHANNEL0(), StepPRINT();
405*b1cdbd2cSJim Jagielski void StepPRINTF(), StepWRITE(), StepRENAME(), StepPROMPT();
406*b1cdbd2cSJim Jagielski void StepRESTART(), StepEMPTY(), StepLEAVE();
407*b1cdbd2cSJim Jagielski void StepLSET(), StepRSET(), StepREDIMP_ERASE(), StepERASE_CLEAR();
408*b1cdbd2cSJim Jagielski void StepARRAYACCESS(), StepBYVAL();
409*b1cdbd2cSJim Jagielski // Alle Opcodes mit einem Operanden
410*b1cdbd2cSJim Jagielski void StepLOADNC( sal_uInt32 ), StepLOADSC( sal_uInt32 ), StepLOADI( sal_uInt32 );
411*b1cdbd2cSJim Jagielski void StepARGN( sal_uInt32 ), StepBASED( sal_uInt32 ), StepPAD( sal_uInt32 );
412*b1cdbd2cSJim Jagielski void StepJUMP( sal_uInt32 ), StepJUMPT( sal_uInt32 );
413*b1cdbd2cSJim Jagielski void StepJUMPF( sal_uInt32 ), StepONJUMP( sal_uInt32 );
414*b1cdbd2cSJim Jagielski void StepGOSUB( sal_uInt32 ), StepRETURN( sal_uInt32 );
415*b1cdbd2cSJim Jagielski void StepTESTFOR( sal_uInt32 ), StepCASETO( sal_uInt32 ), StepERRHDL( sal_uInt32 );
416*b1cdbd2cSJim Jagielski void StepRESUME( sal_uInt32 ), StepSETCLASS( sal_uInt32 ), StepVBASETCLASS( sal_uInt32 ), StepTESTCLASS( sal_uInt32 ), StepLIB( sal_uInt32 );
417*b1cdbd2cSJim Jagielski bool checkClass_Impl( const SbxVariableRef& refVal, const String& aClass, bool bRaiseErrors, bool bDefault = true );
418*b1cdbd2cSJim Jagielski void StepCLOSE( sal_uInt32 ), StepPRCHAR( sal_uInt32 ), StepARGTYP( sal_uInt32 );
419*b1cdbd2cSJim Jagielski // Alle Opcodes mit zwei Operanden
420*b1cdbd2cSJim Jagielski void StepRTL( sal_uInt32, sal_uInt32 ), StepPUBLIC( sal_uInt32, sal_uInt32 ), StepPUBLIC_P( sal_uInt32, sal_uInt32 );
421*b1cdbd2cSJim Jagielski void StepPUBLIC_Impl( sal_uInt32, sal_uInt32, bool bUsedForClassModule );
422*b1cdbd2cSJim Jagielski void StepFIND_Impl( SbxObject* pObj, sal_uInt32 nOp1, sal_uInt32 nOp2, SbError, sal_Bool bLocal, sal_Bool bStatic = sal_False );
423*b1cdbd2cSJim Jagielski void StepFIND( sal_uInt32, sal_uInt32 ), StepELEM( sal_uInt32, sal_uInt32 );
424*b1cdbd2cSJim Jagielski void StepGLOBAL( sal_uInt32, sal_uInt32 ), StepLOCAL( sal_uInt32, sal_uInt32 );
425*b1cdbd2cSJim Jagielski void StepPARAM( sal_uInt32, sal_uInt32), StepCREATE( sal_uInt32, sal_uInt32 );
426*b1cdbd2cSJim Jagielski void StepCALL( sal_uInt32, sal_uInt32 ), StepCALLC( sal_uInt32, sal_uInt32 );
427*b1cdbd2cSJim Jagielski void StepCASEIS( sal_uInt32, sal_uInt32 ), StepSTMNT( sal_uInt32, sal_uInt32 );
428*b1cdbd2cSJim Jagielski SbxVariable* StepSTATIC_Impl( String& aName, SbxDataType& t );
429*b1cdbd2cSJim Jagielski void StepOPEN( sal_uInt32, sal_uInt32 ), StepSTATIC( sal_uInt32, sal_uInt32 );
430*b1cdbd2cSJim Jagielski void StepTCREATE(sal_uInt32,sal_uInt32), StepDCREATE(sal_uInt32,sal_uInt32);
431*b1cdbd2cSJim Jagielski void StepGLOBAL_P( sal_uInt32, sal_uInt32 ),StepFIND_G( sal_uInt32, sal_uInt32 );
432*b1cdbd2cSJim Jagielski void StepDCREATE_REDIMP(sal_uInt32,sal_uInt32), StepDCREATE_IMPL(sal_uInt32,sal_uInt32);
433*b1cdbd2cSJim Jagielski void StepFIND_CM( sal_uInt32, sal_uInt32 );
434*b1cdbd2cSJim Jagielski void StepFIND_STATIC( sal_uInt32, sal_uInt32 );
435*b1cdbd2cSJim Jagielski void implHandleSbxFlags( SbxVariable* pVar, SbxDataType t, sal_uInt32 nOp2 );
436*b1cdbd2cSJim Jagielski public:
437*b1cdbd2cSJim Jagielski void SetVBAEnabled( bool bEnabled );
438*b1cdbd2cSJim Jagielski sal_uInt16 GetImageFlag( sal_uInt16 n ) const;
439*b1cdbd2cSJim Jagielski sal_uInt16 GetBase();
440*b1cdbd2cSJim Jagielski xub_StrLen nLine,nCol1,nCol2; // aktuelle Zeile, Spaltenbereich
441*b1cdbd2cSJim Jagielski SbiRuntime* pNext; // Stack-Chain
442*b1cdbd2cSJim Jagielski
443*b1cdbd2cSJim Jagielski SbiRuntime( SbModule*, SbMethod*, sal_uInt32 );
444*b1cdbd2cSJim Jagielski ~SbiRuntime();
445*b1cdbd2cSJim Jagielski void Error( SbError, bool bVBATranslationAlreadyDone = false ); // Fehler setzen, falls != 0
446*b1cdbd2cSJim Jagielski void Error( SbError, const String& ); // Fehler setzen, falls != 0
447*b1cdbd2cSJim Jagielski void FatalError( SbError ); // Fehlerbehandlung=Standard, Fehler setzen
448*b1cdbd2cSJim Jagielski void FatalError( SbError, const String& ); // Fehlerbehandlung=Standard, Fehler setzen
449*b1cdbd2cSJim Jagielski static sal_Int32 translateErrorToVba( SbError nError, String& rMsg );
450*b1cdbd2cSJim Jagielski void DumpPCode();
451*b1cdbd2cSJim Jagielski sal_Bool Step(); // Einzelschritt (ein Opcode)
Stop()452*b1cdbd2cSJim Jagielski void Stop() { bRun = sal_False; }
IsRun()453*b1cdbd2cSJim Jagielski sal_Bool IsRun() { return bRun; }
block(void)454*b1cdbd2cSJim Jagielski void block( void ) { bBlocked = sal_True; }
unblock(void)455*b1cdbd2cSJim Jagielski void unblock( void ) { bBlocked = sal_False; }
GetMethod()456*b1cdbd2cSJim Jagielski SbMethod* GetMethod() { return pMeth; }
GetModule()457*b1cdbd2cSJim Jagielski SbModule* GetModule() { return pMod; }
GetDebugFlags()458*b1cdbd2cSJim Jagielski sal_uInt16 GetDebugFlags() { return nFlags; }
SetDebugFlags(sal_uInt16 nFl)459*b1cdbd2cSJim Jagielski void SetDebugFlags( sal_uInt16 nFl ) { nFlags = nFl; }
460*b1cdbd2cSJim Jagielski SbMethod* GetCaller();
461*b1cdbd2cSJim Jagielski SbxArray* GetLocals();
462*b1cdbd2cSJim Jagielski SbxArray* GetParams();
463*b1cdbd2cSJim Jagielski
464*b1cdbd2cSJim Jagielski SbiForStack* FindForStackItemForCollection( class BasicCollection* pCollection );
465*b1cdbd2cSJim Jagielski
466*b1cdbd2cSJim Jagielski SbxBase* FindElementExtern( const String& rName );
467*b1cdbd2cSJim Jagielski static bool isVBAEnabled();
468*b1cdbd2cSJim Jagielski
469*b1cdbd2cSJim Jagielski };
470*b1cdbd2cSJim Jagielski
checkArithmeticOverflow(double d)471*b1cdbd2cSJim Jagielski inline void checkArithmeticOverflow( double d )
472*b1cdbd2cSJim Jagielski {
473*b1cdbd2cSJim Jagielski if( !::rtl::math::isFinite( d ) )
474*b1cdbd2cSJim Jagielski StarBASIC::Error( SbERR_MATH_OVERFLOW );
475*b1cdbd2cSJim Jagielski }
476*b1cdbd2cSJim Jagielski
checkArithmeticOverflow(SbxVariable * pVar)477*b1cdbd2cSJim Jagielski inline void checkArithmeticOverflow( SbxVariable* pVar )
478*b1cdbd2cSJim Jagielski {
479*b1cdbd2cSJim Jagielski if( pVar->GetType() == SbxDOUBLE )
480*b1cdbd2cSJim Jagielski {
481*b1cdbd2cSJim Jagielski double d = pVar->GetDouble();
482*b1cdbd2cSJim Jagielski checkArithmeticOverflow( d );
483*b1cdbd2cSJim Jagielski }
484*b1cdbd2cSJim Jagielski }
485*b1cdbd2cSJim Jagielski
486*b1cdbd2cSJim Jagielski // Hilfsfunktion, um aktives Basic zu finden
487*b1cdbd2cSJim Jagielski StarBASIC* GetCurrentBasic( StarBASIC* pRTBasic );
488*b1cdbd2cSJim Jagielski
489*b1cdbd2cSJim Jagielski // Get information if security restrictions should be
490*b1cdbd2cSJim Jagielski // used (File IO based on UCB, no RTL function SHELL
491*b1cdbd2cSJim Jagielski // no DDE functionality, no DLLCALL) in basic because
492*b1cdbd2cSJim Jagielski // of portal "virtual" users (portal user != UNIX user)
493*b1cdbd2cSJim Jagielski // (Implemented in iosys.cxx)
494*b1cdbd2cSJim Jagielski sal_Bool needSecurityRestrictions( void );
495*b1cdbd2cSJim Jagielski
496*b1cdbd2cSJim Jagielski // Returns sal_True if UNO is available, otherwise the old
497*b1cdbd2cSJim Jagielski // file system implementation has to be used
498*b1cdbd2cSJim Jagielski // (Implemented in iosys.cxx)
499*b1cdbd2cSJim Jagielski sal_Bool hasUno( void );
500*b1cdbd2cSJim Jagielski
501*b1cdbd2cSJim Jagielski // Converts possibly relative paths to absolute paths
502*b1cdbd2cSJim Jagielski // according to the setting done by ChDir/ChDrive
503*b1cdbd2cSJim Jagielski // (Implemented in methods.cxx)
504*b1cdbd2cSJim Jagielski String getFullPath( const String& aRelPath );
505*b1cdbd2cSJim Jagielski
506*b1cdbd2cSJim Jagielski // Sets (virtual) current path for UCB file access
507*b1cdbd2cSJim Jagielski void implChDir( const String& aDir );
508*b1cdbd2cSJim Jagielski
509*b1cdbd2cSJim Jagielski // Sets (virtual) current drive for UCB file access
510*b1cdbd2cSJim Jagielski void implChDrive( const String& aDrive );
511*b1cdbd2cSJim Jagielski
512*b1cdbd2cSJim Jagielski // Returns (virtual) current path for UCB file access
513*b1cdbd2cSJim Jagielski String implGetCurDir( void );
514*b1cdbd2cSJim Jagielski
515*b1cdbd2cSJim Jagielski // Implementation of StepRENAME with UCB
516*b1cdbd2cSJim Jagielski // (Implemented in methods.cxx, so step0.cxx
517*b1cdbd2cSJim Jagielski // has not to be infected with UNO)
518*b1cdbd2cSJim Jagielski void implStepRenameUCB( const String& aSource, const String& aDest );
519*b1cdbd2cSJim Jagielski
520*b1cdbd2cSJim Jagielski //*** OSL file access ***
521*b1cdbd2cSJim Jagielski // #87427 OSL need File URLs, so map to getFullPath
getFullPathUNC(const String & aRelPath)522*b1cdbd2cSJim Jagielski inline String getFullPathUNC( const String& aRelPath )
523*b1cdbd2cSJim Jagielski {
524*b1cdbd2cSJim Jagielski return getFullPath( aRelPath );
525*b1cdbd2cSJim Jagielski }
526*b1cdbd2cSJim Jagielski void implStepRenameOSL( const String& aSource, const String& aDest );
527*b1cdbd2cSJim Jagielski bool IsBaseIndexOne();
528*b1cdbd2cSJim Jagielski
529*b1cdbd2cSJim Jagielski #endif
530*b1cdbd2cSJim Jagielski
531