xref: /core/basic/source/runtime/stdobj.cxx (revision af3316b6)
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  *   Licensed to the Apache Software Foundation (ASF) under one or more
12  *   contributor license agreements. See the NOTICE file distributed
13  *   with this work for additional information regarding copyright
14  *   ownership. The ASF licenses this file to you under the Apache
15  *   License, Version 2.0 (the "License"); you may not use this file
16  *   except in compliance with the License. You may obtain a copy of
17  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
20 
21 #include <runtime.hxx>
22 #include <stdobj.hxx>
23 #include <sbstdobj.hxx>
24 #include <rtlproto.hxx>
25 #include <sbintern.hxx>
26 // The nArgs-field of a table entry is encrypted as follows:
27 // At the moment it is assumed that properties don't need any
28 // parameters!
29 
30 // previously ARGSMASK_ was 0x007F ( e.g. up to 127 args ) however 63 should be
31 // enough, if not we need to increase the size of nArgs member in the Methods
32 // struct below.
33 // note: the limitation of 63 args is only for RTL functions defined here and
34 // does NOT impose a limit on User defined procedures ). This changes is to
35 // allow us space for a flag to denylist some functions in vba mode
36 
37 #define ARGSMASK_   0x003F  // 63 Arguments
38 #define COMPTMASK_  0x00C0  // COMPATIBILITY mask
39 #define COMPATONLY_ 0x0080  // procedure is visible in vba mode only
40 #define NORMONLY_   0x0040  // procedure is visible in normal mode only
41 
42 #define RWMASK_     0x0F00  // mask for R/W-bits
43 #define TYPEMASK_   0xF000  // mask for the entry's type
44 
45 #define OPT_        0x0400  // parameter is optional
46 #define CONST_      0x0800  // property is const
47 #define METHOD_     0x3000
48 #define PROPERTY_   0x4000
49 #define OBJECT_     0x8000
50                             // combination of bits above:
51 #define FUNCTION_   0x1100
52 #define LFUNCTION_  0x1300  // mask for function which also works as Lvalue
53 #define SUB_        0x2100
54 #define ROPROP_     0x4100  // mask Read Only-Property
55 #define RWPROP_     0x4300  // mask Read/Write-Property
56 #define CPROP_      0x4900  // mask for constant
57 
58 namespace {
59 
60 struct Method {
61     RtlCall     pFunc;
62     std::u16string_view sName;
63     SbxDataType eType;
64     short       nArgs;
65     sal_uInt16      nHash;
66     constexpr Method(std::u16string_view name, SbxDataType type, short args, RtlCall func)
67         : pFunc(func)
68         , sName(name)
69         , eType(type)
70         , nArgs(args)
71         , nHash(SbxVariable::MakeHashCode(name))
72     {
73     }
74 };
75 
76 constexpr Method arg(std::u16string_view name, SbxDataType type, short args = 0)
77 {
78     return Method(name, type, args, nullptr);
79 }
80 
81 template <int N> constexpr bool MethodsTableValid(const Method (&rMethods)[N])
82 {
83     int nCurMethArgs = 0;
84     int nArgsChecked = 0;
85     bool bFinished = false;
86     for (const auto& m : rMethods)
87     {
88         assert(!bFinished); // no entries after end-of-table entry
89         if (bFinished)
90             return false;
91         if (m.nArgs == -1) // end-of-table entry
92         {
93             assert(nCurMethArgs == nArgsChecked); // last method had correct # of arguments
94             if (nCurMethArgs != nArgsChecked)
95                 return false;
96             bFinished = true;
97         }
98         else if (m.pFunc) // main (function/sub/etc) entry
99         {
100             assert(nCurMethArgs == nArgsChecked); // previous method had correct # of arguments
101             if (nCurMethArgs != nArgsChecked)
102                 return false;
103             nCurMethArgs = m.nArgs & ARGSMASK_;
104             nArgsChecked = 0;
105         }
106         else // subordinate (argument) entry
107             ++nArgsChecked;
108     }
109     assert(bFinished); // its last entry was end-of-table entry
110     return bFinished;
111 }
112 
113 }
114 
115 constexpr Method aMethods[] = {
116 
117 { u"Abs",                           SbxDOUBLE,   1 | FUNCTION_,        SbRtl_Abs                  },
118     arg(u"number", SbxDOUBLE),
119 
120 { u"Array",                         SbxOBJECT,       FUNCTION_,        SbRtl_Array                },
121 { u"Asc",                           SbxLONG,     1 | FUNCTION_,        SbRtl_Asc                  },
122     arg(u"string", SbxSTRING),
123 
124 { u"AscW",                          SbxLONG,     1 | FUNCTION_ | COMPATONLY_, SbRtl_Asc           },
125     arg(u"string", SbxSTRING),
126 
127 { u"Atn",                           SbxDOUBLE,   1 | FUNCTION_,        SbRtl_Atn                  },
128     arg(u"number", SbxDOUBLE),
129 
130 { u"ATTR_ARCHIVE",                  SbxINTEGER,      CPROP_,           SbRtl_ATTR_ARCHIVE         },
131 { u"ATTR_DIRECTORY",                SbxINTEGER,      CPROP_,           SbRtl_ATTR_DIRECTORY       },
132 { u"ATTR_HIDDEN",                   SbxINTEGER,      CPROP_,           SbRtl_ATTR_HIDDEN          },
133 { u"ATTR_NORMAL",                   SbxINTEGER,      CPROP_,           SbRtl_ATTR_NORMAL          },
134 { u"ATTR_READONLY",                 SbxINTEGER,      CPROP_,           SbRtl_ATTR_READONLY        },
135 { u"ATTR_SYSTEM",                   SbxINTEGER,      CPROP_,           SbRtl_ATTR_SYSTEM          },
136 { u"ATTR_VOLUME",                   SbxINTEGER,      CPROP_,           SbRtl_ATTR_VOLUME          },
137 
138 { u"Beep",                          SbxNULL,         FUNCTION_,        SbRtl_Beep                 },
139 { u"Blue",                          SbxINTEGER,  1 | FUNCTION_ | NORMONLY_, SbRtl_Blue            },
140     arg(u"RGB-Value", SbxLONG),
141 
142 { u"CallByName",                    SbxVARIANT,  3 | FUNCTION_,        SbRtl_CallByName           },
143     arg(u"Object",        SbxOBJECT),
144     arg(u"ProcedureName", SbxSTRING),
145     arg(u"CallType",      SbxINTEGER),
146 
147 { u"CBool",                         SbxBOOL,     1 | FUNCTION_,        SbRtl_CBool                },
148     arg(u"expression", SbxVARIANT),
149 
150 { u"CByte",                         SbxBYTE,     1 | FUNCTION_,        SbRtl_CByte                },
151     arg(u"expression", SbxVARIANT),
152 
153 { u"CCur",                          SbxCURRENCY, 1 | FUNCTION_,        SbRtl_CCur                 },
154     arg(u"expression", SbxVARIANT),
155 
156 { u"CDate",                         SbxDATE,     1 | FUNCTION_,        SbRtl_CDate                },
157     arg(u"expression", SbxVARIANT),
158 
159 { u"CDateFromUnoDate",              SbxDATE,     1 | FUNCTION_,        SbRtl_CDateFromUnoDate     },
160     arg(u"UnoDate", SbxOBJECT),
161 
162 { u"CDateToUnoDate",                SbxOBJECT,   1 | FUNCTION_,        SbRtl_CDateToUnoDate       },
163     arg(u"Date", SbxDATE),
164 
165 { u"CDateFromUnoTime",              SbxDATE,     1 | FUNCTION_,        SbRtl_CDateFromUnoTime     },
166     arg(u"UnoTime", SbxOBJECT),
167 
168 { u"CDateToUnoTime",                SbxOBJECT,   1 | FUNCTION_,        SbRtl_CDateToUnoTime       },
169     arg(u"Time", SbxDATE),
170 
171 { u"CDateFromUnoDateTime",          SbxDATE,     1 | FUNCTION_,        SbRtl_CDateFromUnoDateTime },
172     arg(u"UnoDateTime", SbxOBJECT),
173 
174 { u"CDateToUnoDateTime",            SbxOBJECT,   1 | FUNCTION_,        SbRtl_CDateToUnoDateTime   },
175     arg(u"DateTime", SbxDATE),
176 
177 { u"CDateFromIso",                  SbxDATE,     1 | FUNCTION_,        SbRtl_CDateFromIso         },
178     arg(u"IsoDate", SbxSTRING),
179 
180 { u"CDateToIso",                    SbxSTRING,   1 | FUNCTION_,        SbRtl_CDateToIso           },
181     arg(u"Date", SbxDATE),
182 
183 { u"CDec",                          SbxDECIMAL,  1 | FUNCTION_,        SbRtl_CDec                 },
184     arg(u"expression", SbxVARIANT),
185 
186 { u"CDbl",                          SbxDOUBLE,   1 | FUNCTION_,        SbRtl_CDbl                 },
187     arg(u"expression", SbxVARIANT),
188 
189 { u"CF_BITMAP",                     SbxINTEGER,      CPROP_,           SbRtl_CF_BITMAP            },
190 { u"CF_METAFILEPICT",               SbxINTEGER,      CPROP_,           SbRtl_CF_METAFILEPICT      },
191 { u"CF_TEXT",                       SbxINTEGER,      CPROP_,           SbRtl_CF_TEXT              },
192 { u"ChDir",                         SbxNULL,     1 | FUNCTION_,        SbRtl_ChDir                },
193     arg(u"string", SbxSTRING),
194 
195 { u"ChDrive",                       SbxNULL,     1 | FUNCTION_,        SbRtl_ChDrive              },
196     arg(u"string", SbxSTRING),
197 
198 { u"Choose",                        SbxVARIANT,  2 | FUNCTION_,        SbRtl_Choose               },
199     arg(u"Index",      SbxINTEGER),
200     arg(u"Expression", SbxVARIANT),
201 
202 { u"Chr",                           SbxSTRING,   1 | FUNCTION_,        SbRtl_Chr                  },
203     arg(u"charcode", SbxLONG),
204 
205 { u"ChrW",                          SbxSTRING,   1 | FUNCTION_ | COMPATONLY_, SbRtl_ChrW          },
206     arg(u"charcode", SbxLONG),
207 
208 { u"CInt",                          SbxINTEGER,  1 | FUNCTION_,        SbRtl_CInt                 },
209     arg(u"expression", SbxVARIANT),
210 
211 { u"CLEAR_ALLTABS",                 SbxINTEGER,       CPROP_,          SbRtl_CLEAR_ALLTABS        },
212 { u"CLEAR_TAB",                     SbxINTEGER,       CPROP_,          SbRtl_CLEAR_TAB            },
213 { u"CLng",                          SbxLONG,     1 | FUNCTION_,        SbRtl_CLng                 },
214     arg(u"expression", SbxVARIANT),
215 
216 { u"CompatibilityMode",             SbxBOOL,     1 | FUNCTION_,        SbRtl_CompatibilityMode    },
217     arg(u"bEnable", SbxBOOL),
218 
219 { u"ConvertFromUrl",                SbxSTRING,   1 | FUNCTION_,        SbRtl_ConvertFromUrl       },
220     arg(u"Url", SbxSTRING),
221 
222 { u"ConvertToUrl",                  SbxSTRING,   1 | FUNCTION_,        SbRtl_ConvertToUrl         },
223     arg(u"SystemPath", SbxSTRING),
224 
225 { u"Cos",                           SbxDOUBLE,   1 | FUNCTION_,        SbRtl_Cos                  },
226     arg(u"number", SbxDOUBLE),
227 
228 { u"CreateObject",                  SbxOBJECT,   1 | FUNCTION_,        SbRtl_CreateObject         },
229     arg(u"class", SbxSTRING),
230 
231 { u"CreateUnoListener",             SbxOBJECT,   2 | FUNCTION_,        SbRtl_CreateUnoListener    },
232     arg(u"prefix",   SbxSTRING),
233     arg(u"typename", SbxSTRING),
234 
235 { u"CreateUnoDialog",               SbxOBJECT,   2 | FUNCTION_,        SbRtl_CreateUnoDialog      },
236     arg(u"dialoglibrary", SbxOBJECT),
237     arg(u"dialogname",    SbxSTRING),
238 
239 { u"CreateUnoService",              SbxOBJECT,   1 | FUNCTION_,        SbRtl_CreateUnoService     },
240     arg(u"servicename", SbxSTRING),
241 
242 { u"CreateUnoServiceWithArguments", SbxOBJECT, 2 | FUNCTION_, SbRtl_CreateUnoServiceWithArguments },
243     arg(u"servicename", SbxSTRING),
244     arg(u"arguments",   SbxARRAY),
245 
246 { u"CreateUnoStruct",               SbxOBJECT,   1 | FUNCTION_,        SbRtl_CreateUnoStruct      },
247     arg(u"classname", SbxSTRING),
248 
249 { u"CreateUnoValue",                SbxOBJECT,   2 | FUNCTION_,        SbRtl_CreateUnoValue       },
250     arg(u"type",  SbxSTRING),
251     arg(u"value", SbxVARIANT),
252 
253 { u"CreatePropertySet",             SbxOBJECT,   1 | FUNCTION_,        SbRtl_CreatePropertySet    },
254     arg(u"values", SbxARRAY),
255 
256 { u"CSng",                          SbxSINGLE,   1 | FUNCTION_,        SbRtl_CSng                 },
257     arg(u"expression", SbxVARIANT),
258 
259 { u"CStr",                          SbxSTRING,   1 | FUNCTION_,        SbRtl_CStr                 },
260     arg(u"expression", SbxVARIANT),
261 
262 { u"CurDir",                        SbxSTRING,   1 | FUNCTION_,        SbRtl_CurDir               },
263     arg(u"string", SbxSTRING),
264 
265 { u"CVar",                          SbxVARIANT,  1 | FUNCTION_,        SbRtl_CVar                 },
266     arg(u"expression", SbxVARIANT),
267 
268 { u"CVErr",                         SbxVARIANT,  1 | FUNCTION_,        SbRtl_CVErr                },
269     arg(u"expression", SbxVARIANT),
270 
271 { u"DDB",                           SbxDOUBLE,   5 | FUNCTION_ | COMPATONLY_, SbRtl_DDB           },
272     arg(u"Cost",    SbxDOUBLE),
273     arg(u"Salvage", SbxDOUBLE),
274     arg(u"Life",    SbxDOUBLE),
275     arg(u"Period",  SbxDOUBLE),
276     arg(u"Factor",  SbxVARIANT, OPT_),
277 
278 { u"Date",                          SbxDATE,         LFUNCTION_,       SbRtl_Date                 },
279 { u"DateAdd",                       SbxDATE,     3 | FUNCTION_,        SbRtl_DateAdd              },
280     arg(u"Interval", SbxSTRING),
281     arg(u"Number",   SbxLONG),
282     arg(u"Date",     SbxDATE),
283 
284 { u"DateDiff",                      SbxDOUBLE,   5 | FUNCTION_,        SbRtl_DateDiff             },
285     arg(u"Interval",        SbxSTRING),
286     arg(u"Date1",           SbxDATE),
287     arg(u"Date2",           SbxDATE),
288     arg(u"Firstdayofweek",  SbxINTEGER, OPT_),
289     arg(u"Firstweekofyear", SbxINTEGER, OPT_),
290 
291 { u"DatePart",                      SbxLONG,     4 | FUNCTION_,        SbRtl_DatePart             },
292     arg(u"Interval",        SbxSTRING),
293     arg(u"Date",            SbxDATE),
294     arg(u"Firstdayofweek",  SbxINTEGER, OPT_),
295     arg(u"Firstweekofyear", SbxINTEGER, OPT_),
296 
297 { u"DateSerial",                    SbxDATE,     3 | FUNCTION_,        SbRtl_DateSerial           },
298     arg(u"Year",  SbxINTEGER),
299     arg(u"Month", SbxINTEGER),
300     arg(u"Day",   SbxINTEGER),
301 
302 { u"DateValue",                     SbxDATE,     1 | FUNCTION_,        SbRtl_DateValue            },
303     arg(u"String", SbxSTRING),
304 
305 { u"Day",                           SbxINTEGER,  1 | FUNCTION_,        SbRtl_Day                  },
306     arg(u"Date", SbxDATE),
307 
308 { u"Ddeexecute",                    SbxNULL,     2 | FUNCTION_,        SbRtl_DDEExecute           },
309     arg(u"Channel", SbxLONG),
310     arg(u"Command", SbxSTRING),
311 
312 { u"Ddeinitiate",                   SbxINTEGER,  2 | FUNCTION_,        SbRtl_DDEInitiate          },
313     arg(u"Application", SbxSTRING),
314     arg(u"Topic",       SbxSTRING),
315 
316 { u"Ddepoke",                       SbxNULL,     3 | FUNCTION_,        SbRtl_DDEPoke              },
317     arg(u"Channel", SbxLONG),
318     arg(u"Item",    SbxSTRING),
319     arg(u"Data",    SbxSTRING),
320 
321 { u"Dderequest",                    SbxSTRING,   2 | FUNCTION_,        SbRtl_DDERequest           },
322     arg(u"Channel", SbxLONG),
323     arg(u"Item",    SbxSTRING),
324 
325 { u"Ddeterminate",                  SbxNULL,     1 | FUNCTION_,        SbRtl_DDETerminate         },
326     arg(u"Channel", SbxLONG),
327 
328 { u"Ddeterminateall",               SbxNULL,         FUNCTION_,        SbRtl_DDETerminateAll      },
329 { u"DimArray",                      SbxOBJECT,       FUNCTION_,        SbRtl_DimArray             },
330 { u"Dir",                           SbxSTRING,   2 | FUNCTION_,        SbRtl_Dir                  },
331     arg(u"FileSpec", SbxSTRING,  OPT_),
332     arg(u"attrmask", SbxINTEGER, OPT_),
333 
334 { u"DoEvents",                      SbxINTEGER,      FUNCTION_,        SbRtl_DoEvents             },
335 { u"DumpAllObjects",                SbxEMPTY,    2 | SUB_,             SbRtl_DumpAllObjects       },
336     arg(u"FileSpec", SbxSTRING),
337     arg(u"DumpAll",  SbxINTEGER, OPT_),
338 
339 { u"Empty",                         SbxVARIANT,      CPROP_,           SbRtl_Empty                },
340 { u"EqualUnoObjects",               SbxBOOL,     2 | FUNCTION_,        SbRtl_EqualUnoObjects      },
341     arg(u"Variant", SbxVARIANT),
342     arg(u"Variant", SbxVARIANT),
343 
344 { u"EnableReschedule",              SbxNULL,     1 | FUNCTION_,        SbRtl_EnableReschedule     },
345     arg(u"bEnable", SbxBOOL),
346 
347 { u"Environ",                       SbxSTRING,   1 | FUNCTION_,        SbRtl_Environ              },
348     arg(u"Environmentstring", SbxSTRING),
349 
350 { u"EOF",                           SbxBOOL,     1 | FUNCTION_,        SbRtl_EOF                  },
351     arg(u"Channel", SbxINTEGER),
352 
353 { u"Erl",                           SbxLONG,         ROPROP_,          SbRtl_Erl                  },
354 { u"Err",                           SbxVARIANT,      RWPROP_,          SbRtl_Err                  },
355 { u"Error",                         SbxSTRING,   1 | FUNCTION_,        SbRtl_Error                },
356     arg(u"code", SbxLONG),
357 
358 { u"Exp",                           SbxDOUBLE,   1 | FUNCTION_,        SbRtl_Exp                  },
359     arg(u"number", SbxDOUBLE),
360 
361 { u"False",                         SbxBOOL,         CPROP_,           SbRtl_False                },
362 { u"FileAttr",                      SbxINTEGER,  2 | FUNCTION_,        SbRtl_FileAttr             },
363     arg(u"Channel",    SbxINTEGER),
364     arg(u"Attributes", SbxINTEGER),
365 
366 { u"FileCopy",                      SbxNULL,     2 | FUNCTION_,        SbRtl_FileCopy             },
367     arg(u"Source",      SbxSTRING),
368     arg(u"Destination", SbxSTRING),
369 
370 { u"FileDateTime",                  SbxSTRING,   1 | FUNCTION_,        SbRtl_FileDateTime         },
371     arg(u"filename", SbxSTRING),
372 
373 { u"FileExists",                    SbxBOOL,     1 | FUNCTION_,        SbRtl_FileExists           },
374     arg(u"filename", SbxSTRING),
375 
376 { u"FileLen",                       SbxLONG,     1 | FUNCTION_,        SbRtl_FileLen              },
377     arg(u"filename", SbxSTRING),
378 
379 { u"FindObject",                    SbxOBJECT,   1 | FUNCTION_,        SbRtl_FindObject           },
380     arg(u"Name", SbxSTRING),
381 
382 { u"FindPropertyObject",            SbxOBJECT,   2 | FUNCTION_,        SbRtl_FindPropertyObject   },
383     arg(u"Object", SbxOBJECT),
384     arg(u"Name",   SbxSTRING),
385 
386 { u"Fix",                           SbxDOUBLE,   1 | FUNCTION_,        SbRtl_Fix                  },
387     arg(u"number", SbxDOUBLE),
388 
389 { u"Format",                        SbxSTRING,   2 | FUNCTION_,        SbRtl_Format               },
390     arg(u"expression", SbxVARIANT),
391     arg(u"format",     SbxSTRING, OPT_),
392 
393 { u"FormatDateTime",                SbxSTRING,   2 | FUNCTION_ | COMPATONLY_, SbRtl_FormatDateTime},
394     arg(u"Date",        SbxDATE),
395     arg(u"NamedFormat", SbxINTEGER, OPT_),
396 
397 { u"FormatNumber",                  SbxSTRING,   5 | FUNCTION_ | COMPATONLY_, SbRtl_FormatNumber  },
398     arg(u"expression",                  SbxDOUBLE),
399     arg(u"numDigitsAfterDecimal",       SbxINTEGER, OPT_),
400     arg(u"includeLeadingDigit",         SbxINTEGER, OPT_), // vbTriState
401     arg(u"useParensForNegativeNumbers", SbxINTEGER, OPT_), // vbTriState
402     arg(u"groupDigits",                 SbxINTEGER, OPT_), // vbTriState
403 
404 { u"Frac",                          SbxDOUBLE,   1 | FUNCTION_,        SbRtl_Frac                 },
405     arg(u"number", SbxDOUBLE),
406 
407 { u"FRAMEANCHORCHAR",               SbxINTEGER,      CPROP_,           SbRtl_FRAMEANCHORCHAR      },
408 { u"FRAMEANCHORPAGE",               SbxINTEGER,      CPROP_,           SbRtl_FRAMEANCHORPAGE      },
409 { u"FRAMEANCHORPARA",               SbxINTEGER,      CPROP_,           SbRtl_FRAMEANCHORPARA      },
410 { u"FreeFile",                      SbxINTEGER,      FUNCTION_,        SbRtl_FreeFile             },
411 { u"FreeLibrary",                   SbxNULL,     1 | FUNCTION_,        SbRtl_FreeLibrary          },
412     arg(u"Modulename", SbxSTRING),
413 
414 { u"FV",                            SbxDOUBLE,   5 | FUNCTION_ | COMPATONLY_, SbRtl_FV            },
415     arg(u"Rate", SbxDOUBLE),
416     arg(u"NPer", SbxDOUBLE),
417     arg(u"Pmt",  SbxDOUBLE),
418     arg(u"PV",   SbxVARIANT, OPT_),
419     arg(u"Due",  SbxVARIANT, OPT_),
420 
421 { u"Get",                           SbxNULL,     3 | FUNCTION_,        SbRtl_Get                  },
422     arg(u"filenumber",   SbxINTEGER),
423     arg(u"recordnumber", SbxLONG),
424     arg(u"variablename", SbxVARIANT),
425 
426 { u"GetAttr",                       SbxINTEGER,  1 | FUNCTION_,        SbRtl_GetAttr              },
427     arg(u"filename", SbxSTRING),
428 
429 { u"GetDefaultContext",             SbxOBJECT,   0 | FUNCTION_,        SbRtl_GetDefaultContext    },
430 { u"GetDialogZoomFactorX",          SbxDOUBLE,       FUNCTION_,        SbRtl_GetDialogZoomFactorX },
431 { u"GetDialogZoomFactorY",          SbxDOUBLE,       FUNCTION_,        SbRtl_GetDialogZoomFactorY },
432 { u"GetGUIType",                    SbxINTEGER,      FUNCTION_,        SbRtl_GetGUIType           },
433 { u"GetGUIVersion",                 SbxLONG,         FUNCTION_,        SbRtl_GetGUIVersion        },
434 { u"GetPathSeparator",              SbxSTRING,       FUNCTION_,        SbRtl_GetPathSeparator     },
435 { u"GetProcessServiceManager",      SbxOBJECT,   0 | FUNCTION_,    SbRtl_GetProcessServiceManager },
436 { u"GetSolarVersion",               SbxLONG,         FUNCTION_,        SbRtl_GetSolarVersion      },
437 { u"GetSystemTicks",                SbxLONG,         FUNCTION_,        SbRtl_GetSystemTicks       },
438 { u"GetSystemType",                 SbxINTEGER,      FUNCTION_,        SbRtl_GetSystemType        },
439 { u"GlobalScope",                   SbxOBJECT,       FUNCTION_,        SbRtl_GlobalScope          },
440 { u"Green",                         SbxINTEGER,  1 | FUNCTION_ | NORMONLY_, SbRtl_Green           },
441     arg(u"RGB-Value", SbxLONG),
442 
443 { u"HasUnoInterfaces",              SbxBOOL,     1 | FUNCTION_,        SbRtl_HasUnoInterfaces     },
444     arg(u"InterfaceName", SbxSTRING),
445 
446 { u"Hex",                           SbxSTRING,   1 | FUNCTION_,        SbRtl_Hex                  },
447     arg(u"number", SbxLONG),
448 
449 { u"Hour",                          SbxINTEGER,  1 | FUNCTION_,        SbRtl_Hour                 },
450     arg(u"Date", SbxDATE),
451 
452 { u"IDABORT",                       SbxINTEGER,      CPROP_,           SbRtl_IDABORT              },
453 { u"IDCANCEL",                      SbxINTEGER,      CPROP_,           SbRtl_IDCANCEL             },
454 { u"IDIGNORE",                      SbxINTEGER,      CPROP_,           SbRtl_IDIGNORE             },
455 { u"IDNO",                          SbxINTEGER,      CPROP_,           SbRtl_IDNO                 },
456 { u"IDOK",                          SbxINTEGER,      CPROP_,           SbRtl_IDOK                 },
457 { u"IDRETRY",                       SbxINTEGER,      CPROP_,           SbRtl_IDRETRY              },
458 { u"IDYES",                         SbxINTEGER,      CPROP_,           SbRtl_IDYES                },
459 
460 { u"Iif",                           SbxVARIANT,   3 | FUNCTION_,       SbRtl_Iif                  },
461     arg(u"Bool",     SbxBOOL),
462     arg(u"Variant1", SbxVARIANT),
463     arg(u"Variant2", SbxVARIANT),
464 
465 { u"Input",                         SbxSTRING,    2 | FUNCTION_ | COMPATONLY_, SbRtl_Input        },
466     arg(u"Number",     SbxLONG),
467     arg(u"FileNumber", SbxLONG),
468 
469 { u"InputBox",                      SbxSTRING,    5 | FUNCTION_,       SbRtl_InputBox             },
470     arg(u"Prompt",    SbxSTRING),
471     arg(u"Title",     SbxSTRING, OPT_),
472     arg(u"Default",   SbxSTRING, OPT_),
473     arg(u"XPosTwips", SbxLONG,   OPT_),
474     arg(u"YPosTwips", SbxLONG,   OPT_),
475 
476 { u"InStr",                         SbxLONG,      4 | FUNCTION_,       SbRtl_InStr                },
477     arg(u"Start",   SbxSTRING,  OPT_),
478     arg(u"String1", SbxSTRING),
479     arg(u"String2", SbxSTRING),
480     arg(u"Compare", SbxINTEGER, OPT_),
481 
482 { u"InStrRev",                      SbxLONG,      4 | FUNCTION_ | COMPATONLY_, SbRtl_InStrRev     },
483     arg(u"String1", SbxSTRING),
484     arg(u"String2", SbxSTRING),
485     arg(u"Start",   SbxSTRING,  OPT_),
486     arg(u"Compare", SbxINTEGER, OPT_),
487 
488 { u"Int",                           SbxDOUBLE,    1 | FUNCTION_,       SbRtl_Int                  },
489     arg(u"number", SbxDOUBLE),
490 
491 { u"IPmt",                          SbxDOUBLE,    6 | FUNCTION_ | COMPATONLY_, SbRtl_IPmt         },
492     arg(u"Rate", SbxDOUBLE),
493     arg(u"Per",  SbxDOUBLE),
494     arg(u"NPer", SbxDOUBLE),
495     arg(u"PV",   SbxDOUBLE),
496     arg(u"FV",   SbxVARIANT, OPT_),
497     arg(u"Due",  SbxVARIANT, OPT_),
498 
499 { u"IRR",                           SbxDOUBLE,    2 | FUNCTION_ | COMPATONLY_, SbRtl_IRR          },
500     arg(u"ValueArray", SbxARRAY),
501     arg(u"Guess", SbxVARIANT, OPT_),
502 
503 { u"IsArray",                       SbxBOOL,      1 | FUNCTION_,       SbRtl_IsArray              },
504     arg(u"Variant", SbxVARIANT),
505 
506 { u"IsDate",                        SbxBOOL,      1 | FUNCTION_,       SbRtl_IsDate               },
507     arg(u"Variant", SbxVARIANT),
508 
509 { u"IsEmpty",                       SbxBOOL,      1 | FUNCTION_,       SbRtl_IsEmpty              },
510     arg(u"Variant", SbxVARIANT),
511 
512 { u"IsError",                       SbxBOOL,      1 | FUNCTION_,       SbRtl_IsError              },
513     arg(u"Variant", SbxVARIANT),
514 
515 { u"IsMissing",                     SbxBOOL,      1 | FUNCTION_,       SbRtl_IsMissing            },
516     arg(u"Variant", SbxVARIANT),
517 
518 { u"IsNull",                        SbxBOOL,      1 | FUNCTION_,       SbRtl_IsNull               },
519     arg(u"Variant", SbxVARIANT),
520 
521 { u"IsNumeric",                     SbxBOOL,      1 | FUNCTION_,       SbRtl_IsNumeric            },
522     arg(u"Variant", SbxVARIANT),
523 
524 { u"IsObject",                      SbxBOOL,      1 | FUNCTION_,       SbRtl_IsObject             },
525     arg(u"Variant", SbxVARIANT),
526 
527 { u"IsUnoStruct",                   SbxBOOL,      1 | FUNCTION_,       SbRtl_IsUnoStruct          },
528     arg(u"Variant", SbxVARIANT),
529 
530 { u"Join",                          SbxSTRING,    2 | FUNCTION_,       SbRtl_Join                 },
531     arg(u"list",      SbxOBJECT),
532     arg(u"delimiter", SbxSTRING),
533 
534 { u"Kill",                          SbxNULL,      1 | FUNCTION_,       SbRtl_Kill                 },
535     arg(u"filespec", SbxSTRING),
536 
537 { u"LBound",                        SbxLONG,      1 | FUNCTION_,       SbRtl_LBound               },
538     arg(u"Variant", SbxVARIANT),
539 
540 { u"LCase",                         SbxSTRING,    1 | FUNCTION_,       SbRtl_LCase                },
541     arg(u"string", SbxSTRING),
542 
543 { u"Left",                          SbxSTRING,    2 | FUNCTION_,       SbRtl_Left                 },
544     arg(u"String", SbxSTRING),
545     arg(u"Count",  SbxLONG),
546 
547 { u"Len",                           SbxLONG,      1 | FUNCTION_,       SbRtl_Len                  },
548     arg(u"StringOrVariant", SbxVARIANT),
549 
550 { u"LenB",                          SbxLONG,      1 | FUNCTION_,       SbRtl_Len                  },
551     arg(u"StringOrVariant", SbxVARIANT),
552 
553 { u"Load",                          SbxNULL,      1 | FUNCTION_,       SbRtl_Load                 },
554     arg(u"object", SbxOBJECT),
555 
556 { u"LoadPicture",                   SbxOBJECT,    1 | FUNCTION_,       SbRtl_LoadPicture          },
557     arg(u"string", SbxSTRING),
558 
559 { u"Loc",                           SbxLONG,      1 | FUNCTION_,       SbRtl_Loc                  },
560     arg(u"Channel", SbxINTEGER),
561 
562 { u"Lof",                           SbxLONG,      1 | FUNCTION_,       SbRtl_Lof                  },
563     arg(u"Channel", SbxINTEGER),
564 
565 { u"Log",                           SbxDOUBLE,    1 | FUNCTION_,       SbRtl_Log                  },
566     arg(u"number", SbxDOUBLE),
567 
568 { u"LTrim",                         SbxSTRING,    1 | FUNCTION_,       SbRtl_LTrim                },
569     arg(u"string", SbxSTRING),
570 
571 { u"MB_ABORTRETRYIGNORE",           SbxINTEGER,       CPROP_,          SbRtl_MB_ABORTRETRYIGNORE  },
572 { u"MB_APPLMODAL",                  SbxINTEGER,       CPROP_,          SbRtl_MB_APPLMODAL         },
573 { u"MB_DEFBUTTON1",                 SbxINTEGER,       CPROP_,          SbRtl_MB_DEFBUTTON1        },
574 { u"MB_DEFBUTTON2",                 SbxINTEGER,       CPROP_,          SbRtl_MB_DEFBUTTON2        },
575 { u"MB_DEFBUTTON3",                 SbxINTEGER,       CPROP_,          SbRtl_MB_DEFBUTTON3        },
576 { u"MB_ICONEXCLAMATION",            SbxINTEGER,       CPROP_,          SbRtl_MB_ICONEXCLAMATION   },
577 { u"MB_ICONINFORMATION",            SbxINTEGER,       CPROP_,          SbRtl_MB_ICONINFORMATION   },
578 { u"MB_ICONQUESTION",               SbxINTEGER,       CPROP_,          SbRtl_MB_ICONQUESTION      },
579 { u"MB_ICONSTOP",                   SbxINTEGER,       CPROP_,          SbRtl_MB_ICONSTOP          },
580 { u"MB_OK",                         SbxINTEGER,       CPROP_,          SbRtl_MB_OK                },
581 { u"MB_OKCANCEL",                   SbxINTEGER,       CPROP_,          SbRtl_MB_OKCANCEL          },
582 { u"MB_RETRYCANCEL",                SbxINTEGER,       CPROP_,          SbRtl_MB_RETRYCANCEL       },
583 { u"MB_SYSTEMMODAL",                SbxINTEGER,       CPROP_,          SbRtl_MB_SYSTEMMODAL       },
584 { u"MB_YESNO",                      SbxINTEGER,       CPROP_,          SbRtl_MB_YESNO             },
585 { u"MB_YESNOCANCEL",                SbxINTEGER,       CPROP_,          SbRtl_MB_YESNOCANCEL       },
586 
587 { u"Me",                            SbxOBJECT,    0 | FUNCTION_ | COMPATONLY_, SbRtl_Me           },
588 { u"Mid",                           SbxSTRING,    3 | LFUNCTION_,      SbRtl_Mid                  },
589     arg(u"String",   SbxSTRING),
590     arg(u"StartPos", SbxLONG),
591     arg(u"Length",   SbxLONG, OPT_),
592 
593 { u"Minute",                        SbxINTEGER,   1 | FUNCTION_,       SbRtl_Minute               },
594     arg(u"Date", SbxDATE),
595 
596 { u"MIRR",                          SbxDOUBLE,    3 | FUNCTION_ | COMPATONLY_, SbRtl_MIRR         },
597     arg(u"ValueArray",   SbxARRAY),
598     arg(u"FinanceRate",  SbxDOUBLE),
599     arg(u"ReinvestRate", SbxDOUBLE),
600 
601 { u"MkDir",                         SbxNULL,      1 | FUNCTION_,       SbRtl_MkDir                },
602     arg(u"pathname", SbxSTRING),
603 
604 { u"Month",                         SbxINTEGER,   1 | FUNCTION_,       SbRtl_Month                },
605     arg(u"Date", SbxDATE),
606 
607 { u"MonthName",                     SbxSTRING,    2 | FUNCTION_ | COMPATONLY_, SbRtl_MonthName    },
608     arg(u"Month",      SbxINTEGER),
609     arg(u"Abbreviate", SbxBOOL, OPT_),
610 
611 { u"MsgBox",                        SbxINTEGER,   5 | FUNCTION_,       SbRtl_MsgBox               },
612     arg(u"Prompt",   SbxSTRING),
613     arg(u"Buttons",  SbxINTEGER, OPT_),
614     arg(u"Title",    SbxSTRING,  OPT_),
615     arg(u"Helpfile", SbxSTRING,  OPT_),
616     arg(u"Context",  SbxINTEGER, OPT_),
617 
618 { u"Nothing",                       SbxOBJECT,        CPROP_,          SbRtl_Nothing              },
619 { u"Now",                           SbxDATE,          FUNCTION_,       SbRtl_Now                  },
620 { u"NPer",                          SbxDOUBLE,    5 | FUNCTION_ | COMPATONLY_, SbRtl_NPer         },
621     arg(u"Rate", SbxDOUBLE),
622     arg(u"Pmt",  SbxDOUBLE),
623     arg(u"PV",   SbxDOUBLE),
624     arg(u"FV",   SbxVARIANT, OPT_),
625     arg(u"Due",  SbxVARIANT, OPT_),
626 
627 { u"NPV",                           SbxDOUBLE,    2 | FUNCTION_ | COMPATONLY_, SbRtl_NPV          },
628     arg(u"Rate", SbxDOUBLE),
629     arg(u"ValueArray", SbxARRAY),
630 
631 { u"Null",                          SbxNULL,          CPROP_,          SbRtl_Null                 },
632 
633 { u"Oct",                           SbxSTRING,    1 | FUNCTION_,       SbRtl_Oct                  },
634     arg(u"number", SbxLONG),
635 
636 { u"Partition",                     SbxSTRING,    4 | FUNCTION_,       SbRtl_Partition            },
637     arg(u"number",   SbxLONG),
638     arg(u"start",    SbxLONG),
639     arg(u"stop",     SbxLONG),
640     arg(u"interval", SbxLONG),
641 
642 { u"Pi",                            SbxDOUBLE,        CPROP_,          SbRtl_PI                   },
643 
644 { u"Pmt",                           SbxDOUBLE,    5 | FUNCTION_ | COMPATONLY_, SbRtl_Pmt          },
645     arg(u"Rate", SbxDOUBLE),
646     arg(u"NPer", SbxDOUBLE),
647     arg(u"PV",   SbxDOUBLE),
648     arg(u"FV",   SbxVARIANT, OPT_),
649     arg(u"Due",  SbxVARIANT, OPT_),
650 
651 { u"PPmt",                          SbxDOUBLE,    6 | FUNCTION_ | COMPATONLY_, SbRtl_PPmt         },
652     arg(u"Rate", SbxDOUBLE),
653     arg(u"Per",  SbxDOUBLE),
654     arg(u"NPer", SbxDOUBLE),
655     arg(u"PV",   SbxDOUBLE),
656     arg(u"FV",   SbxVARIANT, OPT_),
657     arg(u"Due",  SbxVARIANT, OPT_),
658 
659 { u"Put",                           SbxNULL,      3 | FUNCTION_,       SbRtl_Put                  },
660     arg(u"filenumber",   SbxINTEGER),
661     arg(u"recordnumber", SbxLONG),
662     arg(u"variablename", SbxVARIANT),
663 
664 { u"PV",                            SbxDOUBLE,    5 | FUNCTION_ | COMPATONLY_, SbRtl_PV           },
665     arg(u"Rate", SbxDOUBLE),
666     arg(u"NPer", SbxDOUBLE),
667     arg(u"Pmt",  SbxDOUBLE),
668     arg(u"FV",   SbxVARIANT, OPT_),
669     arg(u"Due",  SbxVARIANT, OPT_),
670 
671 { u"QBColor",                       SbxLONG,      1 | FUNCTION_,       SbRtl_QBColor              },
672     arg(u"number", SbxINTEGER),
673 
674 { u"Randomize",                     SbxNULL,      1 | FUNCTION_,       SbRtl_Randomize            },
675     arg(u"Number", SbxDOUBLE, OPT_),
676 
677 { u"Rate",                          SbxDOUBLE,    6 | FUNCTION_ | COMPATONLY_, SbRtl_Rate         },
678     arg(u"NPer",  SbxDOUBLE),
679     arg(u"Pmt",   SbxDOUBLE),
680     arg(u"PV",    SbxDOUBLE),
681     arg(u"FV",    SbxVARIANT, OPT_),
682     arg(u"Due",   SbxVARIANT, OPT_),
683     arg(u"Guess", SbxVARIANT, OPT_),
684 
685 { u"Red",                           SbxINTEGER,   1 | FUNCTION_ | NORMONLY_, SbRtl_Red            },
686     arg(u"RGB-Value", SbxLONG),
687 
688 { u"Reset",                         SbxNULL,      0 | FUNCTION_,       SbRtl_Reset                },
689 { u"ResolvePath",                   SbxSTRING,    1 | FUNCTION_,       SbRtl_ResolvePath          },
690     arg(u"Path", SbxSTRING),
691 
692 { u"RGB",                           SbxLONG,      3 | FUNCTION_,       SbRtl_RGB                  },
693     arg(u"Red",   SbxINTEGER),
694     arg(u"Green", SbxINTEGER),
695     arg(u"Blue",  SbxINTEGER),
696 
697 { u"Replace",                       SbxSTRING,    6 | FUNCTION_,       SbRtl_Replace              },
698     arg(u"Expression", SbxSTRING),
699     arg(u"Find",       SbxSTRING),
700     arg(u"Replace",    SbxSTRING),
701     arg(u"Start",      SbxINTEGER, OPT_),
702     arg(u"Count",      SbxINTEGER, OPT_),
703     arg(u"Compare",    SbxINTEGER, OPT_),
704 
705 { u"Right",                         SbxSTRING,    2 | FUNCTION_,       SbRtl_Right                },
706     arg(u"String", SbxSTRING),
707     arg(u"Count",  SbxLONG),
708 
709 { u"RmDir",                         SbxNULL,      1 | FUNCTION_,       SbRtl_RmDir                },
710     arg(u"pathname", SbxSTRING),
711 
712 { u"Round",                         SbxDOUBLE,    2 | FUNCTION_ | COMPATONLY_, SbRtl_Round        },
713     arg(u"Expression",       SbxDOUBLE),
714     arg(u"Numdecimalplaces", SbxINTEGER, OPT_),
715 
716 { u"Rnd",                           SbxDOUBLE,    1 | FUNCTION_,       SbRtl_Rnd                  },
717     arg(u"Number", SbxDOUBLE, OPT_),
718 
719 { u"RTL",                           SbxOBJECT,    0 | FUNCTION_ | COMPATONLY_, SbRtl_RTL          },
720 { u"RTrim",                         SbxSTRING,    1 | FUNCTION_,       SbRtl_RTrim                },
721     arg(u"string", SbxSTRING),
722 
723 { u"SavePicture",                   SbxNULL,      2 | FUNCTION_,       SbRtl_SavePicture          },
724     arg(u"object", SbxOBJECT),
725     arg(u"string", SbxSTRING),
726 
727 { u"Second",                        SbxINTEGER,   1 | FUNCTION_,       SbRtl_Second               },
728     arg(u"Date", SbxDATE),
729 
730 { u"Seek",                          SbxLONG,      1 | FUNCTION_,       SbRtl_Seek                 },
731     arg(u"Channel", SbxINTEGER),
732 
733 { u"SendKeys",                      SbxNULL,      2 | FUNCTION_,       SbRtl_SendKeys             },
734     arg(u"String", SbxSTRING),
735     arg(u"Wait",   SbxBOOL, OPT_),
736 
737 { u"SetAttr",                       SbxNULL,      2 | FUNCTION_,       SbRtl_SetAttr              },
738     arg(u"File",       SbxSTRING),
739     arg(u"Attributes", SbxINTEGER),
740 
741 { u"SET_OFF",                       SbxINTEGER,       CPROP_,          SbRtl_SET_OFF              },
742 { u"SET_ON",                        SbxINTEGER,       CPROP_,          SbRtl_SET_ON               },
743 { u"SET_TAB",                       SbxINTEGER,       CPROP_,          SbRtl_SET_TAB              },
744 { u"Sgn",                           SbxINTEGER,   1 | FUNCTION_,       SbRtl_Sgn                  },
745     arg(u"number", SbxDOUBLE),
746 
747 { u"Shell",                         SbxLONG,      2 | FUNCTION_,       SbRtl_Shell                },
748     arg(u"Commandstring", SbxSTRING),
749     arg(u"WindowStyle",   SbxINTEGER, OPT_),
750 
751 { u"Sin",                           SbxDOUBLE,    1 | FUNCTION_,       SbRtl_Sin                  },
752     arg(u"number", SbxDOUBLE),
753 
754 { u"SLN",                           SbxDOUBLE,    3 |  FUNCTION_ | COMPATONLY_, SbRtl_SLN         },
755     arg(u"Cost",   SbxDOUBLE),
756     arg(u"Double", SbxDOUBLE),
757     arg(u"Life",   SbxDOUBLE),
758 
759 { u"SYD",                           SbxDOUBLE,    4 |  FUNCTION_ | COMPATONLY_, SbRtl_SYD         },
760     arg(u"Cost",    SbxDOUBLE),
761     arg(u"Salvage", SbxDOUBLE),
762     arg(u"Life",    SbxDOUBLE),
763     arg(u"Period",  SbxDOUBLE),
764 
765 { u"Space",                         SbxSTRING,    1 | FUNCTION_,       SbRtl_Space                },
766     arg(u"Number", SbxLONG),
767 
768 { u"Spc",                           SbxSTRING,    1 | FUNCTION_,       SbRtl_Space                },
769     arg(u"Number", SbxLONG),
770 
771 { u"Split",                         SbxOBJECT,    3 | FUNCTION_,       SbRtl_Split                },
772     arg(u"expression", SbxSTRING),
773     arg(u"delimiter",  SbxSTRING),
774     arg(u"count",      SbxLONG),
775 
776 { u"Sqr",                           SbxDOUBLE,    1 | FUNCTION_,       SbRtl_Sqr                  },
777     arg(u"number", SbxDOUBLE),
778 
779 { u"Str",                           SbxSTRING,    1 | FUNCTION_,       SbRtl_Str                  },
780     arg(u"number", SbxDOUBLE),
781 
782 { u"StrComp",                       SbxINTEGER,   3 | FUNCTION_,       SbRtl_StrComp              },
783     arg(u"String1", SbxSTRING),
784     arg(u"String2", SbxSTRING),
785     arg(u"Compare", SbxINTEGER, OPT_),
786 
787 { u"StrConv",                       SbxOBJECT,    3 | FUNCTION_,       SbRtl_StrConv              },
788     arg(u"String",     SbxSTRING),
789     arg(u"Conversion", SbxSTRING),
790     arg(u"LCID",       SbxINTEGER, OPT_),
791 
792 { u"String",                        SbxSTRING,    2 | FUNCTION_,       SbRtl_String               },
793     arg(u"Count",  SbxLONG),
794     arg(u"Filler", SbxVARIANT),
795 
796 { u"StrReverse",                    SbxSTRING,    1 | FUNCTION_ | COMPATONLY_, SbRtl_StrReverse   },
797     arg(u"String1", SbxSTRING),
798 
799 { u"Switch",                        SbxVARIANT,   2 | FUNCTION_,       SbRtl_Switch               },
800     arg(u"Expression", SbxVARIANT),
801     arg(u"Value",      SbxVARIANT),
802 
803 { u"Tab",                           SbxSTRING,    1 | FUNCTION_,       SbRtl_Tab                  },
804     arg(u"Count", SbxLONG),
805 
806 { u"Tan",                           SbxDOUBLE,    1 | FUNCTION_,       SbRtl_Tan                  },
807     arg(u"number", SbxDOUBLE),
808 
809 { u"Time",                          SbxVARIANT,       LFUNCTION_,      SbRtl_Time                 },
810 { u"Timer",                         SbxDATE,          FUNCTION_,       SbRtl_Timer                },
811 { u"TimeSerial",                    SbxDATE,      3 | FUNCTION_,       SbRtl_TimeSerial           },
812     arg(u"Hour",   SbxLONG),
813     arg(u"Minute", SbxLONG),
814     arg(u"Second", SbxLONG),
815 
816 { u"TimeValue",                     SbxDATE,      1 | FUNCTION_,       SbRtl_TimeValue            },
817     arg(u"String", SbxSTRING),
818 
819 { u"TOGGLE",                        SbxINTEGER,       CPROP_,          SbRtl_TOGGLE               },
820 { u"Trim",                          SbxSTRING,    1 | FUNCTION_,       SbRtl_Trim                 },
821     arg(u"String", SbxSTRING),
822 
823 { u"True",                          SbxBOOL,          CPROP_,          SbRtl_True                 },
824 { u"TwipsPerPixelX",                SbxLONG,          FUNCTION_,       SbRtl_TwipsPerPixelX       },
825 { u"TwipsPerPixelY",                SbxLONG,          FUNCTION_,       SbRtl_TwipsPerPixelY       },
826 
827 { u"TYP_AUTHORFLD",                 SbxINTEGER,       CPROP_,          SbRtl_TYP_AUTHORFLD        },
828 { u"TYP_CHAPTERFLD",                SbxINTEGER,       CPROP_,          SbRtl_TYP_CHAPTERFLD       },
829 { u"TYP_CONDTXTFLD",                SbxINTEGER,       CPROP_,          SbRtl_TYP_CONDTXTFLD       },
830 { u"TYP_DATEFLD",                   SbxINTEGER,       CPROP_,          SbRtl_TYP_DATEFLD          },
831 { u"TYP_DBFLD",                     SbxINTEGER,       CPROP_,          SbRtl_TYP_DBFLD            },
832 { u"TYP_DBNAMEFLD",                 SbxINTEGER,       CPROP_,          SbRtl_TYP_DBNAMEFLD        },
833 { u"TYP_DBNEXTSETFLD",              SbxINTEGER,       CPROP_,          SbRtl_TYP_DBNEXTSETFLD     },
834 { u"TYP_DBNUMSETFLD",               SbxINTEGER,       CPROP_,          SbRtl_TYP_DBNUMSETFLD      },
835 { u"TYP_DBSETNUMBERFLD",            SbxINTEGER,       CPROP_,          SbRtl_TYP_DBSETNUMBERFLD   },
836 { u"TYP_DDEFLD",                    SbxINTEGER,       CPROP_,          SbRtl_TYP_DDEFLD           },
837 { u"TYP_DOCINFOFLD",                SbxINTEGER,       CPROP_,          SbRtl_TYP_DOCINFOFLD       },
838 { u"TYP_DOCSTATFLD",                SbxINTEGER,       CPROP_,          SbRtl_TYP_DOCSTATFLD       },
839 { u"TYP_EXTUSERFLD",                SbxINTEGER,       CPROP_,          SbRtl_TYP_EXTUSERFLD       },
840 { u"TYP_FILENAMEFLD",               SbxINTEGER,       CPROP_,          SbRtl_TYP_FILENAMEFLD      },
841 { u"TYP_FIXDATEFLD",                SbxINTEGER,       CPROP_,          SbRtl_TYP_FIXDATEFLD       },
842 { u"TYP_FIXTIMEFLD",                SbxINTEGER,       CPROP_,          SbRtl_TYP_FIXTIMEFLD       },
843 { u"TYP_FORMELFLD",                 SbxINTEGER,       CPROP_,          SbRtl_TYP_FORMELFLD        },
844 { u"TYP_GETFLD",                    SbxINTEGER,       CPROP_,          SbRtl_TYP_GETFLD           },
845 { u"TYP_GETREFFLD",                 SbxINTEGER,       CPROP_,          SbRtl_TYP_GETREFFLD        },
846 { u"TYP_GETREFPAGEFLD",             SbxINTEGER,       CPROP_,          SbRtl_TYP_GETREFPAGEFLD    },
847 { u"TYP_HIDDENPARAFLD",             SbxINTEGER,       CPROP_,          SbRtl_TYP_HIDDENPARAFLD    },
848 { u"TYP_HIDDENTXTFLD",              SbxINTEGER,       CPROP_,          SbRtl_TYP_HIDDENTXTFLD     },
849 { u"TYP_INPUTFLD",                  SbxINTEGER,       CPROP_,          SbRtl_TYP_INPUTFLD         },
850 { u"TYP_INTERNETFLD",               SbxINTEGER,       CPROP_,          SbRtl_TYP_INTERNETFLD      },
851 { u"TYP_JUMPEDITFLD",               SbxINTEGER,       CPROP_,          SbRtl_TYP_JUMPEDITFLD      },
852 { u"TYP_MACROFLD",                  SbxINTEGER,       CPROP_,          SbRtl_TYP_MACROFLD         },
853 { u"TYP_NEXTPAGEFLD",               SbxINTEGER,       CPROP_,          SbRtl_TYP_NEXTPAGEFLD      },
854 { u"TYP_PAGENUMBERFLD",             SbxINTEGER,       CPROP_,          SbRtl_TYP_PAGENUMBERFLD    },
855 { u"TYP_POSTITFLD",                 SbxINTEGER,       CPROP_,          SbRtl_TYP_POSTITFLD        },
856 { u"TYP_PREVPAGEFLD",               SbxINTEGER,       CPROP_,          SbRtl_TYP_PREVPAGEFLD      },
857 { u"TYP_SEQFLD",                    SbxINTEGER,       CPROP_,          SbRtl_TYP_SEQFLD           },
858 { u"TYP_SETFLD",                    SbxINTEGER,       CPROP_,          SbRtl_TYP_SETFLD           },
859 { u"TYP_SETINPFLD",                 SbxINTEGER,       CPROP_,          SbRtl_TYP_SETINPFLD        },
860 { u"TYP_SETREFFLD",                 SbxINTEGER,       CPROP_,          SbRtl_TYP_SETREFFLD        },
861 { u"TYP_SETREFPAGEFLD",             SbxINTEGER,       CPROP_,          SbRtl_TYP_SETREFPAGEFLD    },
862 { u"TYP_TEMPLNAMEFLD",              SbxINTEGER,       CPROP_,          SbRtl_TYP_TEMPLNAMEFLD     },
863 { u"TYP_TIMEFLD",                   SbxINTEGER,       CPROP_,          SbRtl_TYP_TIMEFLD          },
864 { u"TYP_USERFLD",                   SbxINTEGER,       CPROP_,          SbRtl_TYP_USERFLD          },
865 { u"TYP_USRINPFLD",                 SbxINTEGER,       CPROP_,          SbRtl_TYP_USRINPFLD        },
866 
867 { u"TypeLen",                       SbxINTEGER,   1 | FUNCTION_,       SbRtl_TypeLen              },
868     arg(u"Var", SbxVARIANT),
869 
870 { u"TypeName",                      SbxSTRING,    1 | FUNCTION_,       SbRtl_TypeName             },
871     arg(u"Var", SbxVARIANT),
872 
873 { u"UBound",                        SbxLONG,      1 | FUNCTION_,       SbRtl_UBound               },
874     arg(u"Var", SbxVARIANT),
875 
876 { u"UCase",                         SbxSTRING,    1 | FUNCTION_,       SbRtl_UCase                },
877     arg(u"String", SbxSTRING),
878 
879 { u"Unload",                        SbxNULL,      1 | FUNCTION_,       SbRtl_Unload               },
880     arg(u"Dialog", SbxOBJECT),
881 
882 { u"Val",                           SbxDOUBLE,    1 | FUNCTION_,       SbRtl_Val                  },
883     arg(u"String", SbxSTRING),
884 
885 { u"VarType",                       SbxINTEGER,   1 | FUNCTION_,       SbRtl_VarType              },
886     arg(u"Var", SbxVARIANT),
887 
888 { u"V_EMPTY",                       SbxINTEGER,       CPROP_,          SbRtl_V_EMPTY              },
889 { u"V_NULL",                        SbxINTEGER,       CPROP_,          SbRtl_V_NULL               },
890 { u"V_INTEGER",                     SbxINTEGER,       CPROP_,          SbRtl_V_INTEGER            },
891 { u"V_LONG",                        SbxINTEGER,       CPROP_,          SbRtl_V_LONG               },
892 { u"V_SINGLE",                      SbxINTEGER,       CPROP_,          SbRtl_V_SINGLE             },
893 { u"V_DOUBLE",                      SbxINTEGER,       CPROP_,          SbRtl_V_DOUBLE             },
894 { u"V_CURRENCY",                    SbxINTEGER,       CPROP_,          SbRtl_V_CURRENCY           },
895 { u"V_DATE",                        SbxINTEGER,       CPROP_,          SbRtl_V_DATE               },
896 { u"V_STRING",                      SbxINTEGER,       CPROP_,          SbRtl_V_STRING             },
897 
898 { u"Wait",                          SbxNULL,      1 | FUNCTION_,       SbRtl_Wait                 },
899     arg(u"Milliseconds", SbxLONG),
900 
901 { u"FuncCaller",                    SbxVARIANT,       FUNCTION_,       SbRtl_FuncCaller           },
902 //#i64882#
903 { u"WaitUntil",                     SbxNULL,      1 | FUNCTION_,       SbRtl_WaitUntil            },
904     arg(u"Date", SbxDOUBLE),
905 
906 { u"Weekday",                       SbxINTEGER,   2 | FUNCTION_,       SbRtl_Weekday              },
907     arg(u"Date",           SbxDATE),
908     arg(u"Firstdayofweek", SbxINTEGER, OPT_),
909 
910 { u"WeekdayName",                   SbxSTRING,    3 | FUNCTION_ | COMPATONLY_, SbRtl_WeekdayName  },
911     arg(u"Weekday",        SbxINTEGER),
912     arg(u"Abbreviate",     SbxBOOL,    OPT_),
913     arg(u"Firstdayofweek", SbxINTEGER, OPT_),
914 
915 { u"Year",                          SbxINTEGER,   1 | FUNCTION_,       SbRtl_Year                 },
916     arg(u"Date", SbxDATE),
917 
918 { {}, SbxNULL, -1, nullptr }};  // end of the table
919 
920 static_assert(MethodsTableValid(aMethods));
921 
922 SbiStdObject::SbiStdObject( const OUString& r, StarBASIC* pb ) : SbxObject( r )
923 {
924     // #i92642: Remove default properties
925     Remove( "Name", SbxClassType::DontCare );
926     Remove( "Parent", SbxClassType::DontCare );
927 
928     SetParent( pb );
929 
930     pStdFactory.reset( new SbStdFactory );
931     SbxBase::AddFactory( pStdFactory.get() );
932 
933     Insert( new SbStdClipboard );
934 }
935 
936 SbiStdObject::~SbiStdObject()
937 {
938     SbxBase::RemoveFactory( pStdFactory.get() );
939     pStdFactory.reset();
940 }
941 
942 // Finding an element:
943 // It runs linearly through the method table here until an
944 // adequate method is has been found. Because of the bits in
945 // the nArgs-field the adequate instance of an SbxObjElement
946 // is created then. If the method/property hasn't been found,
947 // return NULL without error code, so that a whole chain of
948 // objects can be asked for the method/property.
949 
950 SbxVariable* SbiStdObject::Find( const OUString& rName, SbxClassType t )
951 {
952     // entered already?
953     SbxVariable* pVar = SbxObject::Find( rName, t );
954     if( !pVar )
955     {
956         // else search one
957         sal_uInt16 nHash_ = SbxVariable::MakeHashCode( rName );
958         const Method* p = aMethods;
959         bool bFound = false;
960         short nIndex = 0;
961         sal_uInt16 nSrchMask = TYPEMASK_;
962         switch( t )
963         {
964             case SbxClassType::Method:   nSrchMask = METHOD_; break;
965             case SbxClassType::Property: nSrchMask = PROPERTY_; break;
966             case SbxClassType::Object:   nSrchMask = OBJECT_; break;
967             default: break;
968         }
969         while( p->nArgs != -1 )
970         {
971             if( ( p->nArgs & nSrchMask )
972              && ( p->nHash == nHash_ )
973                 && (rName.equalsIgnoreAsciiCase(p->sName)))
974             {
975                 bFound = true;
976                 if( p->nArgs & COMPTMASK_ )
977                 {
978                     bool bCompatibility = false;
979                     SbiInstance* pInst = GetSbData()->pInst;
980                     if (pInst)
981                     {
982                         bCompatibility = pInst->IsCompatibility();
983                     }
984                     else
985                     {
986                         // No instance running => compiling a source on module level.
987                         const SbModule* pModule = GetSbData()->pCompMod;
988                         if (pModule)
989                             bCompatibility = pModule->IsVBACompat();
990                     }
991                     if ((bCompatibility && (NORMONLY_ & p->nArgs)) || (!bCompatibility && (COMPATONLY_ & p->nArgs)))
992                         bFound = false;
993                 }
994                 break;
995             }
996             nIndex += ( p->nArgs & ARGSMASK_ ) + 1;
997             p = aMethods + nIndex;
998         }
999 
1000         if( bFound )
1001         {
1002             // isolate Args-fields:
1003             SbxFlagBits nAccess = static_cast<SbxFlagBits>(( p->nArgs & RWMASK_ ) >> 8);
1004             short nType   = ( p->nArgs & TYPEMASK_ );
1005             if( p->nArgs & CONST_ )
1006                 nAccess |= SbxFlagBits::Const;
1007             SbxClassType eCT = SbxClassType::Object;
1008             if( nType & PROPERTY_ )
1009             {
1010                 eCT = SbxClassType::Property;
1011             }
1012             else if( nType & METHOD_ )
1013             {
1014                 eCT = SbxClassType::Method;
1015             }
1016             pVar = Make(OUString(p->sName), eCT, p->eType, (p->nArgs & FUNCTION_) == FUNCTION_);
1017             pVar->SetUserData( nIndex + 1 );
1018             pVar->SetFlags( nAccess );
1019         }
1020     }
1021     return pVar;
1022 }
1023 
1024 // SetModified must be pinched off at the RTL
1025 void SbiStdObject::SetModified( bool )
1026 {
1027 }
1028 
1029 
1030 void SbiStdObject::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
1031 
1032 {
1033     const SbxHint* pHint = dynamic_cast<const SbxHint*>(&rHint);
1034     if( !pHint )
1035         return;
1036 
1037     SbxVariable* pVar = pHint->GetVar();
1038     SbxArray* pPar_ = pVar->GetParameters();
1039     const sal_uInt16 nCallId = static_cast<sal_uInt16>(pVar->GetUserData());
1040     if( nCallId )
1041     {
1042         const SfxHintId t = pHint->GetId();
1043         if( t == SfxHintId::BasicInfoWanted )
1044             pVar->SetInfo( GetInfo( static_cast<short>(pVar->GetUserData()) ) );
1045         else
1046         {
1047             bool bWrite = false;
1048             if( t == SfxHintId::BasicDataChanged )
1049                 bWrite = true;
1050             if( t == SfxHintId::BasicDataWanted || bWrite )
1051             {
1052                 RtlCall p = aMethods[ nCallId-1 ].pFunc;
1053                 SbxArrayRef rPar( pPar_ );
1054                 if( !pPar_ )
1055                 {
1056                     rPar = pPar_ = new SbxArray;
1057                     pPar_->Put(pVar, 0);
1058                 }
1059                 p( static_cast<StarBASIC*>(GetParent()), *pPar_, bWrite );
1060                 return;
1061             }
1062         }
1063     }
1064     SbxObject::Notify( rBC, rHint );
1065 }
1066 
1067 // building the info-structure for single elements
1068 // if nIdx = 0, don't create anything (Std-Props!)
1069 
1070 SbxInfo* SbiStdObject::GetInfo( short nIdx )
1071 {
1072     if( !nIdx )
1073         return nullptr;
1074     const Method* p = &aMethods[ --nIdx ];
1075     SbxInfo* pInfo_ = new SbxInfo;
1076     short nPar = p->nArgs & ARGSMASK_;
1077     for( short i = 0; i < nPar; i++ )
1078     {
1079         p++;
1080         SbxFlagBits nFlags_ = static_cast<SbxFlagBits>(( p->nArgs >> 8 ) & 0x03);
1081         if( p->nArgs & OPT_ )
1082         {
1083             nFlags_ |= SbxFlagBits::Optional;
1084         }
1085         pInfo_->AddParam(OUString(p->sName), p->eType, nFlags_);
1086     }
1087     return pInfo_;
1088 }
1089 
1090 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
1091