xref: /core/basic/source/runtime/stdobj.cxx (revision 1f5797e0)
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"ProcName", 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"Pathname",   SbxSTRING,  OPT_),
332     arg(u"Attributes", 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"FormatPercent",                  SbxSTRING,   5 | FUNCTION_ | COMPATONLY_, SbRtl_FormatPercent  },
405     arg(u"expression",                  SbxDOUBLE),
406     arg(u"numDigitsAfterDecimal",       SbxINTEGER, OPT_),
407     arg(u"includeLeadingDigit",         SbxINTEGER, OPT_), // vbTriState
408     arg(u"useParensForNegativeNumbers", SbxINTEGER, OPT_), // vbTriState
409     arg(u"groupDigits",                 SbxINTEGER, OPT_), // vbTriState
410 
411 { u"Frac",                          SbxDOUBLE,   1 | FUNCTION_,        SbRtl_Frac                 },
412     arg(u"number", SbxDOUBLE),
413 
414 { u"FRAMEANCHORCHAR",               SbxINTEGER,      CPROP_,           SbRtl_FRAMEANCHORCHAR      },
415 { u"FRAMEANCHORPAGE",               SbxINTEGER,      CPROP_,           SbRtl_FRAMEANCHORPAGE      },
416 { u"FRAMEANCHORPARA",               SbxINTEGER,      CPROP_,           SbRtl_FRAMEANCHORPARA      },
417 { u"FreeFile",                      SbxINTEGER,      FUNCTION_,        SbRtl_FreeFile             },
418 { u"FreeLibrary",                   SbxNULL,     1 | FUNCTION_,        SbRtl_FreeLibrary          },
419     arg(u"Modulename", SbxSTRING),
420 
421 { u"FV",                            SbxDOUBLE,   5 | FUNCTION_ | COMPATONLY_, SbRtl_FV            },
422     arg(u"Rate", SbxDOUBLE),
423     arg(u"NPer", SbxDOUBLE),
424     arg(u"Pmt",  SbxDOUBLE),
425     arg(u"PV",   SbxVARIANT, OPT_),
426     arg(u"Due",  SbxVARIANT, OPT_),
427 
428 { u"Get",                           SbxNULL,     3 | FUNCTION_,        SbRtl_Get                  },
429     arg(u"filenumber",   SbxINTEGER),
430     arg(u"recordnumber", SbxLONG),
431     arg(u"variablename", SbxVARIANT),
432 
433 { u"GetAttr",                       SbxINTEGER,  1 | FUNCTION_,        SbRtl_GetAttr              },
434     arg(u"filename", SbxSTRING),
435 
436 { u"GetDefaultContext",             SbxOBJECT,   0 | FUNCTION_,        SbRtl_GetDefaultContext    },
437 { u"GetDialogZoomFactorX",          SbxDOUBLE,       FUNCTION_,        SbRtl_GetDialogZoomFactorX },
438 { u"GetDialogZoomFactorY",          SbxDOUBLE,       FUNCTION_,        SbRtl_GetDialogZoomFactorY },
439 { u"GetGUIType",                    SbxINTEGER,      FUNCTION_,        SbRtl_GetGUIType           },
440 { u"GetGUIVersion",                 SbxLONG,         FUNCTION_,        SbRtl_GetGUIVersion        },
441 { u"GetPathSeparator",              SbxSTRING,       FUNCTION_,        SbRtl_GetPathSeparator     },
442 { u"GetProcessServiceManager",      SbxOBJECT,   0 | FUNCTION_,    SbRtl_GetProcessServiceManager },
443 { u"GetSolarVersion",               SbxLONG,         FUNCTION_,        SbRtl_GetSolarVersion      },
444 { u"GetSystemTicks",                SbxLONG,         FUNCTION_,        SbRtl_GetSystemTicks       },
445 { u"GetSystemType",                 SbxINTEGER,      FUNCTION_,        SbRtl_GetSystemType        },
446 { u"GlobalScope",                   SbxOBJECT,       FUNCTION_,        SbRtl_GlobalScope          },
447 { u"Green",                         SbxINTEGER,  1 | FUNCTION_ | NORMONLY_, SbRtl_Green           },
448     arg(u"RGB-Value", SbxLONG),
449 
450 { u"HasUnoInterfaces",              SbxBOOL,     1 | FUNCTION_,        SbRtl_HasUnoInterfaces     },
451     arg(u"InterfaceName", SbxSTRING),
452 
453 { u"Hex",                           SbxSTRING,   1 | FUNCTION_,        SbRtl_Hex                  },
454     arg(u"number", SbxLONG),
455 
456 { u"Hour",                          SbxINTEGER,  1 | FUNCTION_,        SbRtl_Hour                 },
457     arg(u"Date", SbxDATE),
458 
459 { u"IDABORT",                       SbxINTEGER,      CPROP_,           SbRtl_IDABORT              },
460 { u"IDCANCEL",                      SbxINTEGER,      CPROP_,           SbRtl_IDCANCEL             },
461 { u"IDIGNORE",                      SbxINTEGER,      CPROP_,           SbRtl_IDIGNORE             },
462 { u"IDNO",                          SbxINTEGER,      CPROP_,           SbRtl_IDNO                 },
463 { u"IDOK",                          SbxINTEGER,      CPROP_,           SbRtl_IDOK                 },
464 { u"IDRETRY",                       SbxINTEGER,      CPROP_,           SbRtl_IDRETRY              },
465 { u"IDYES",                         SbxINTEGER,      CPROP_,           SbRtl_IDYES                },
466 
467 { u"Iif",                           SbxVARIANT,   3 | FUNCTION_,       SbRtl_Iif                  },
468     arg(u"Bool",     SbxBOOL),
469     arg(u"Variant1", SbxVARIANT),
470     arg(u"Variant2", SbxVARIANT),
471 
472 { u"Input",                         SbxSTRING,    2 | FUNCTION_ | COMPATONLY_, SbRtl_Input        },
473     arg(u"Number",     SbxLONG),
474     arg(u"FileNumber", SbxLONG),
475 
476 { u"InputBox",                      SbxSTRING,    5 | FUNCTION_,       SbRtl_InputBox             },
477     arg(u"Prompt",    SbxSTRING),
478     arg(u"Title",     SbxSTRING, OPT_),
479     arg(u"Default",   SbxSTRING, OPT_),
480     arg(u"XPosTwips", SbxLONG,   OPT_),
481     arg(u"YPosTwips", SbxLONG,   OPT_),
482 
483 { u"InStr",                         SbxLONG,      4 | FUNCTION_,       SbRtl_InStr                },
484     arg(u"Start",   SbxSTRING,  OPT_),
485     arg(u"String1", SbxSTRING),
486     arg(u"String2", SbxSTRING),
487     arg(u"Compare", SbxINTEGER, OPT_),
488 
489 { u"InStrRev",                      SbxLONG,      4 | FUNCTION_ | COMPATONLY_, SbRtl_InStrRev     },
490     arg(u"StringCheck", SbxSTRING),
491     arg(u"StringMatch", SbxSTRING),
492     arg(u"Start",       SbxSTRING,  OPT_),
493     arg(u"Compare",     SbxINTEGER, OPT_),
494 
495 { u"Int",                           SbxDOUBLE,    1 | FUNCTION_,       SbRtl_Int                  },
496     arg(u"number", SbxDOUBLE),
497 
498 { u"IPmt",                          SbxDOUBLE,    6 | FUNCTION_ | COMPATONLY_, SbRtl_IPmt         },
499     arg(u"Rate", SbxDOUBLE),
500     arg(u"Per",  SbxDOUBLE),
501     arg(u"NPer", SbxDOUBLE),
502     arg(u"PV",   SbxDOUBLE),
503     arg(u"FV",   SbxVARIANT, OPT_),
504     arg(u"Due",  SbxVARIANT, OPT_),
505 
506 { u"IRR",                           SbxDOUBLE,    2 | FUNCTION_ | COMPATONLY_, SbRtl_IRR          },
507     arg(u"ValueArray", SbxARRAY),
508     arg(u"Guess", SbxVARIANT, OPT_),
509 
510 { u"IsArray",                       SbxBOOL,      1 | FUNCTION_,       SbRtl_IsArray              },
511     arg(u"Variant", SbxVARIANT),
512 
513 { u"IsDate",                        SbxBOOL,      1 | FUNCTION_,       SbRtl_IsDate               },
514     arg(u"Variant", SbxVARIANT),
515 
516 { u"IsEmpty",                       SbxBOOL,      1 | FUNCTION_,       SbRtl_IsEmpty              },
517     arg(u"Variant", SbxVARIANT),
518 
519 { u"IsError",                       SbxBOOL,      1 | FUNCTION_,       SbRtl_IsError              },
520     arg(u"Variant", SbxVARIANT),
521 
522 { u"IsMissing",                     SbxBOOL,      1 | FUNCTION_,       SbRtl_IsMissing            },
523     arg(u"Variant", SbxVARIANT),
524 
525 { u"IsNull",                        SbxBOOL,      1 | FUNCTION_,       SbRtl_IsNull               },
526     arg(u"Variant", SbxVARIANT),
527 
528 { u"IsNumeric",                     SbxBOOL,      1 | FUNCTION_,       SbRtl_IsNumeric            },
529     arg(u"Variant", SbxVARIANT),
530 
531 { u"IsObject",                      SbxBOOL,      1 | FUNCTION_,       SbRtl_IsObject             },
532     arg(u"Variant", SbxVARIANT),
533 
534 { u"IsUnoStruct",                   SbxBOOL,      1 | FUNCTION_,       SbRtl_IsUnoStruct          },
535     arg(u"Variant", SbxVARIANT),
536 
537 { u"Join",                          SbxSTRING,    2 | FUNCTION_,       SbRtl_Join                 },
538     arg(u"SourceArray", SbxOBJECT),
539     arg(u"Delimiter",   SbxSTRING),
540 
541 { u"Kill",                          SbxNULL,      1 | FUNCTION_,       SbRtl_Kill                 },
542     arg(u"filespec", SbxSTRING),
543 
544 { u"LBound",                        SbxLONG,      1 | FUNCTION_,       SbRtl_LBound               },
545     arg(u"Variant", SbxVARIANT),
546 
547 { u"LCase",                         SbxSTRING,    1 | FUNCTION_,       SbRtl_LCase                },
548     arg(u"string", SbxSTRING),
549 
550 { u"Left",                          SbxSTRING,    2 | FUNCTION_,       SbRtl_Left                 },
551     arg(u"String", SbxSTRING),
552     arg(u"Length", SbxLONG),
553 
554 { u"Len",                           SbxLONG,      1 | FUNCTION_,       SbRtl_Len                  },
555     arg(u"StringOrVariant", SbxVARIANT),
556 
557 { u"LenB",                          SbxLONG,      1 | FUNCTION_,       SbRtl_Len                  },
558     arg(u"StringOrVariant", SbxVARIANT),
559 
560 { u"Load",                          SbxNULL,      1 | FUNCTION_,       SbRtl_Load                 },
561     arg(u"object", SbxOBJECT),
562 
563 { u"LoadPicture",                   SbxOBJECT,    1 | FUNCTION_,       SbRtl_LoadPicture          },
564     arg(u"string", SbxSTRING),
565 
566 { u"Loc",                           SbxLONG,      1 | FUNCTION_,       SbRtl_Loc                  },
567     arg(u"Channel", SbxINTEGER),
568 
569 { u"Lof",                           SbxLONG,      1 | FUNCTION_,       SbRtl_Lof                  },
570     arg(u"Channel", SbxINTEGER),
571 
572 { u"Log",                           SbxDOUBLE,    1 | FUNCTION_,       SbRtl_Log                  },
573     arg(u"number", SbxDOUBLE),
574 
575 { u"LTrim",                         SbxSTRING,    1 | FUNCTION_,       SbRtl_LTrim                },
576     arg(u"string", SbxSTRING),
577 
578 { u"MB_ABORTRETRYIGNORE",           SbxINTEGER,       CPROP_,          SbRtl_MB_ABORTRETRYIGNORE  },
579 { u"MB_APPLMODAL",                  SbxINTEGER,       CPROP_,          SbRtl_MB_APPLMODAL         },
580 { u"MB_DEFBUTTON1",                 SbxINTEGER,       CPROP_,          SbRtl_MB_DEFBUTTON1        },
581 { u"MB_DEFBUTTON2",                 SbxINTEGER,       CPROP_,          SbRtl_MB_DEFBUTTON2        },
582 { u"MB_DEFBUTTON3",                 SbxINTEGER,       CPROP_,          SbRtl_MB_DEFBUTTON3        },
583 { u"MB_ICONEXCLAMATION",            SbxINTEGER,       CPROP_,          SbRtl_MB_ICONEXCLAMATION   },
584 { u"MB_ICONINFORMATION",            SbxINTEGER,       CPROP_,          SbRtl_MB_ICONINFORMATION   },
585 { u"MB_ICONQUESTION",               SbxINTEGER,       CPROP_,          SbRtl_MB_ICONQUESTION      },
586 { u"MB_ICONSTOP",                   SbxINTEGER,       CPROP_,          SbRtl_MB_ICONSTOP          },
587 { u"MB_OK",                         SbxINTEGER,       CPROP_,          SbRtl_MB_OK                },
588 { u"MB_OKCANCEL",                   SbxINTEGER,       CPROP_,          SbRtl_MB_OKCANCEL          },
589 { u"MB_RETRYCANCEL",                SbxINTEGER,       CPROP_,          SbRtl_MB_RETRYCANCEL       },
590 { u"MB_SYSTEMMODAL",                SbxINTEGER,       CPROP_,          SbRtl_MB_SYSTEMMODAL       },
591 { u"MB_YESNO",                      SbxINTEGER,       CPROP_,          SbRtl_MB_YESNO             },
592 { u"MB_YESNOCANCEL",                SbxINTEGER,       CPROP_,          SbRtl_MB_YESNOCANCEL       },
593 
594 { u"Me",                            SbxOBJECT,    0 | FUNCTION_ | COMPATONLY_, SbRtl_Me           },
595 { u"Mid",                           SbxSTRING,    3 | LFUNCTION_,      SbRtl_Mid                  },
596     arg(u"String", SbxSTRING),
597     arg(u"Start",  SbxLONG),
598     arg(u"Length", SbxLONG, OPT_),
599 
600 { u"Minute",                        SbxINTEGER,   1 | FUNCTION_,       SbRtl_Minute               },
601     arg(u"Date", SbxDATE),
602 
603 { u"MIRR",                          SbxDOUBLE,    3 | FUNCTION_ | COMPATONLY_, SbRtl_MIRR         },
604     arg(u"ValueArray",   SbxARRAY),
605     arg(u"FinanceRate",  SbxDOUBLE),
606     arg(u"ReinvestRate", SbxDOUBLE),
607 
608 { u"MkDir",                         SbxNULL,      1 | FUNCTION_,       SbRtl_MkDir                },
609     arg(u"pathname", SbxSTRING),
610 
611 { u"Month",                         SbxINTEGER,   1 | FUNCTION_,       SbRtl_Month                },
612     arg(u"Date", SbxDATE),
613 
614 { u"MonthName",                     SbxSTRING,    2 | FUNCTION_ | COMPATONLY_, SbRtl_MonthName    },
615     arg(u"Month",      SbxINTEGER),
616     arg(u"Abbreviate", SbxBOOL, OPT_),
617 
618 { u"MsgBox",                        SbxINTEGER,   5 | FUNCTION_,       SbRtl_MsgBox               },
619     arg(u"Prompt",   SbxSTRING),
620     arg(u"Buttons",  SbxINTEGER, OPT_),
621     arg(u"Title",    SbxSTRING,  OPT_),
622     arg(u"Helpfile", SbxSTRING,  OPT_),
623     arg(u"Context",  SbxINTEGER, OPT_),
624 
625 { u"Nothing",                       SbxOBJECT,        CPROP_,          SbRtl_Nothing              },
626 { u"Now",                           SbxDATE,          FUNCTION_,       SbRtl_Now                  },
627 { u"NPer",                          SbxDOUBLE,    5 | FUNCTION_ | COMPATONLY_, SbRtl_NPer         },
628     arg(u"Rate", SbxDOUBLE),
629     arg(u"Pmt",  SbxDOUBLE),
630     arg(u"PV",   SbxDOUBLE),
631     arg(u"FV",   SbxVARIANT, OPT_),
632     arg(u"Due",  SbxVARIANT, OPT_),
633 
634 { u"NPV",                           SbxDOUBLE,    2 | FUNCTION_ | COMPATONLY_, SbRtl_NPV          },
635     arg(u"Rate", SbxDOUBLE),
636     arg(u"ValueArray", SbxARRAY),
637 
638 { u"Null",                          SbxNULL,          CPROP_,          SbRtl_Null                 },
639 
640 { u"Oct",                           SbxSTRING,    1 | FUNCTION_,       SbRtl_Oct                  },
641     arg(u"number", SbxLONG),
642 
643 { u"Partition",                     SbxSTRING,    4 | FUNCTION_,       SbRtl_Partition            },
644     arg(u"number",   SbxLONG),
645     arg(u"start",    SbxLONG),
646     arg(u"stop",     SbxLONG),
647     arg(u"interval", SbxLONG),
648 
649 { u"Pi",                            SbxDOUBLE,        CPROP_,          SbRtl_PI                   },
650 
651 { u"Pmt",                           SbxDOUBLE,    5 | FUNCTION_ | COMPATONLY_, SbRtl_Pmt          },
652     arg(u"Rate", SbxDOUBLE),
653     arg(u"NPer", SbxDOUBLE),
654     arg(u"PV",   SbxDOUBLE),
655     arg(u"FV",   SbxVARIANT, OPT_),
656     arg(u"Due",  SbxVARIANT, OPT_),
657 
658 { u"PPmt",                          SbxDOUBLE,    6 | FUNCTION_ | COMPATONLY_, SbRtl_PPmt         },
659     arg(u"Rate", SbxDOUBLE),
660     arg(u"Per",  SbxDOUBLE),
661     arg(u"NPer", SbxDOUBLE),
662     arg(u"PV",   SbxDOUBLE),
663     arg(u"FV",   SbxVARIANT, OPT_),
664     arg(u"Due",  SbxVARIANT, OPT_),
665 
666 { u"Put",                           SbxNULL,      3 | FUNCTION_,       SbRtl_Put                  },
667     arg(u"filenumber",   SbxINTEGER),
668     arg(u"recordnumber", SbxLONG),
669     arg(u"variablename", SbxVARIANT),
670 
671 { u"PV",                            SbxDOUBLE,    5 | FUNCTION_ | COMPATONLY_, SbRtl_PV           },
672     arg(u"Rate", SbxDOUBLE),
673     arg(u"NPer", SbxDOUBLE),
674     arg(u"Pmt",  SbxDOUBLE),
675     arg(u"FV",   SbxVARIANT, OPT_),
676     arg(u"Due",  SbxVARIANT, OPT_),
677 
678 { u"QBColor",                       SbxLONG,      1 | FUNCTION_,       SbRtl_QBColor              },
679     arg(u"number", SbxINTEGER),
680 
681 { u"Randomize",                     SbxNULL,      1 | FUNCTION_,       SbRtl_Randomize            },
682     arg(u"Number", SbxDOUBLE, OPT_),
683 
684 { u"Rate",                          SbxDOUBLE,    6 | FUNCTION_ | COMPATONLY_, SbRtl_Rate         },
685     arg(u"NPer",  SbxDOUBLE),
686     arg(u"Pmt",   SbxDOUBLE),
687     arg(u"PV",    SbxDOUBLE),
688     arg(u"FV",    SbxVARIANT, OPT_),
689     arg(u"Due",   SbxVARIANT, OPT_),
690     arg(u"Guess", SbxVARIANT, OPT_),
691 
692 { u"Red",                           SbxINTEGER,   1 | FUNCTION_ | NORMONLY_, SbRtl_Red            },
693     arg(u"RGB-Value", SbxLONG),
694 
695 { u"Reset",                         SbxNULL,      0 | FUNCTION_,       SbRtl_Reset                },
696 { u"ResolvePath",                   SbxSTRING,    1 | FUNCTION_,       SbRtl_ResolvePath          },
697     arg(u"Path", SbxSTRING),
698 
699 { u"RGB",                           SbxLONG,      3 | FUNCTION_,       SbRtl_RGB                  },
700     arg(u"Red",   SbxINTEGER),
701     arg(u"Green", SbxINTEGER),
702     arg(u"Blue",  SbxINTEGER),
703 
704 { u"Replace",                       SbxSTRING,    6 | FUNCTION_,       SbRtl_Replace              },
705     arg(u"Expression", SbxSTRING),
706     arg(u"Find",       SbxSTRING),
707     arg(u"Replace",    SbxSTRING),
708     arg(u"Start",      SbxINTEGER, OPT_),
709     arg(u"Count",      SbxINTEGER, OPT_),
710     arg(u"Compare",    SbxINTEGER, OPT_),
711 
712 { u"Right",                         SbxSTRING,    2 | FUNCTION_,       SbRtl_Right                },
713     arg(u"String", SbxSTRING),
714     arg(u"Length", SbxLONG),
715 
716 { u"RmDir",                         SbxNULL,      1 | FUNCTION_,       SbRtl_RmDir                },
717     arg(u"pathname", SbxSTRING),
718 
719 { u"Round",                         SbxDOUBLE,    2 | FUNCTION_ | COMPATONLY_, SbRtl_Round        },
720     arg(u"Expression",       SbxDOUBLE),
721     arg(u"Numdecimalplaces", SbxINTEGER, OPT_),
722 
723 { u"Rnd",                           SbxDOUBLE,    1 | FUNCTION_,       SbRtl_Rnd                  },
724     arg(u"Number", SbxDOUBLE, OPT_),
725 
726 { u"RTL",                           SbxOBJECT,    0 | FUNCTION_ | COMPATONLY_, SbRtl_RTL          },
727 { u"RTrim",                         SbxSTRING,    1 | FUNCTION_,       SbRtl_RTrim                },
728     arg(u"string", SbxSTRING),
729 
730 { u"SavePicture",                   SbxNULL,      2 | FUNCTION_,       SbRtl_SavePicture          },
731     arg(u"object", SbxOBJECT),
732     arg(u"string", SbxSTRING),
733 
734 { u"Second",                        SbxINTEGER,   1 | FUNCTION_,       SbRtl_Second               },
735     arg(u"Date", SbxDATE),
736 
737 { u"Seek",                          SbxLONG,      1 | FUNCTION_,       SbRtl_Seek                 },
738     arg(u"Channel", SbxINTEGER),
739 
740 { u"SendKeys",                      SbxNULL,      2 | FUNCTION_,       SbRtl_SendKeys             },
741     arg(u"String", SbxSTRING),
742     arg(u"Wait",   SbxBOOL, OPT_),
743 
744 { u"SetAttr",                       SbxNULL,      2 | FUNCTION_,       SbRtl_SetAttr              },
745     arg(u"PathName",   SbxSTRING),
746     arg(u"Attributes", SbxINTEGER),
747 
748 { u"SET_OFF",                       SbxINTEGER,       CPROP_,          SbRtl_SET_OFF              },
749 { u"SET_ON",                        SbxINTEGER,       CPROP_,          SbRtl_SET_ON               },
750 { u"SET_TAB",                       SbxINTEGER,       CPROP_,          SbRtl_SET_TAB              },
751 { u"Sgn",                           SbxINTEGER,   1 | FUNCTION_,       SbRtl_Sgn                  },
752     arg(u"number", SbxDOUBLE),
753 
754 { u"Shell",                         SbxLONG,      2 | FUNCTION_,       SbRtl_Shell                },
755     arg(u"PathName",    SbxSTRING),
756     arg(u"WindowStyle", SbxINTEGER, OPT_),
757 
758 { u"Sin",                           SbxDOUBLE,    1 | FUNCTION_,       SbRtl_Sin                  },
759     arg(u"number", SbxDOUBLE),
760 
761 { u"SLN",                           SbxDOUBLE,    3 |  FUNCTION_ | COMPATONLY_, SbRtl_SLN         },
762     arg(u"Cost",   SbxDOUBLE),
763     arg(u"Double", SbxDOUBLE),
764     arg(u"Life",   SbxDOUBLE),
765 
766 { u"SYD",                           SbxDOUBLE,    4 |  FUNCTION_ | COMPATONLY_, SbRtl_SYD         },
767     arg(u"Cost",    SbxDOUBLE),
768     arg(u"Salvage", SbxDOUBLE),
769     arg(u"Life",    SbxDOUBLE),
770     arg(u"Period",  SbxDOUBLE),
771 
772 { u"Space",                         SbxSTRING,    1 | FUNCTION_,       SbRtl_Space                },
773     arg(u"Number", SbxLONG),
774 
775 { u"Spc",                           SbxSTRING,    1 | FUNCTION_,       SbRtl_Space                },
776     arg(u"Number", SbxLONG),
777 
778 { u"Split",                         SbxOBJECT,    3 | FUNCTION_,       SbRtl_Split                },
779     arg(u"expression", SbxSTRING),
780     arg(u"delimiter",  SbxSTRING),
781     arg(u"Limit",      SbxLONG),
782 
783 { u"Sqr",                           SbxDOUBLE,    1 | FUNCTION_,       SbRtl_Sqr                  },
784     arg(u"number", SbxDOUBLE),
785 
786 { u"Str",                           SbxSTRING,    1 | FUNCTION_,       SbRtl_Str                  },
787     arg(u"number", SbxDOUBLE),
788 
789 { u"StrComp",                       SbxINTEGER,   3 | FUNCTION_,       SbRtl_StrComp              },
790     arg(u"String1", SbxSTRING),
791     arg(u"String2", SbxSTRING),
792     arg(u"Compare", SbxINTEGER, OPT_),
793 
794 { u"StrConv",                       SbxOBJECT,    3 | FUNCTION_,       SbRtl_StrConv              },
795     arg(u"String",     SbxSTRING),
796     arg(u"Conversion", SbxSTRING),
797     arg(u"LCID",       SbxINTEGER, OPT_),
798 
799 { u"String",                        SbxSTRING,    2 | FUNCTION_,       SbRtl_String               },
800     arg(u"Number",    SbxLONG),
801     arg(u"Character", SbxVARIANT),
802 
803 { u"StrReverse",                    SbxSTRING,    1 | FUNCTION_ | COMPATONLY_, SbRtl_StrReverse   },
804     arg(u"String1", SbxSTRING),
805 
806 { u"Switch",                        SbxVARIANT,   2 | FUNCTION_,       SbRtl_Switch               },
807     arg(u"Expression", SbxVARIANT),
808     arg(u"Value",      SbxVARIANT),
809 
810 { u"Tab",                           SbxSTRING,    1 | FUNCTION_,       SbRtl_Tab                  },
811     arg(u"Count", SbxLONG),
812 
813 { u"Tan",                           SbxDOUBLE,    1 | FUNCTION_,       SbRtl_Tan                  },
814     arg(u"number", SbxDOUBLE),
815 
816 { u"Time",                          SbxVARIANT,       LFUNCTION_,      SbRtl_Time                 },
817 { u"Timer",                         SbxDATE,          FUNCTION_,       SbRtl_Timer                },
818 { u"TimeSerial",                    SbxDATE,      3 | FUNCTION_,       SbRtl_TimeSerial           },
819     arg(u"Hour",   SbxLONG),
820     arg(u"Minute", SbxLONG),
821     arg(u"Second", SbxLONG),
822 
823 { u"TimeValue",                     SbxDATE,      1 | FUNCTION_,       SbRtl_TimeValue            },
824     arg(u"String", SbxSTRING),
825 
826 { u"TOGGLE",                        SbxINTEGER,       CPROP_,          SbRtl_TOGGLE               },
827 { u"Trim",                          SbxSTRING,    1 | FUNCTION_,       SbRtl_Trim                 },
828     arg(u"String", SbxSTRING),
829 
830 { u"True",                          SbxBOOL,          CPROP_,          SbRtl_True                 },
831 { u"TwipsPerPixelX",                SbxLONG,          FUNCTION_,       SbRtl_TwipsPerPixelX       },
832 { u"TwipsPerPixelY",                SbxLONG,          FUNCTION_,       SbRtl_TwipsPerPixelY       },
833 
834 { u"TYP_AUTHORFLD",                 SbxINTEGER,       CPROP_,          SbRtl_TYP_AUTHORFLD        },
835 { u"TYP_CHAPTERFLD",                SbxINTEGER,       CPROP_,          SbRtl_TYP_CHAPTERFLD       },
836 { u"TYP_CONDTXTFLD",                SbxINTEGER,       CPROP_,          SbRtl_TYP_CONDTXTFLD       },
837 { u"TYP_DATEFLD",                   SbxINTEGER,       CPROP_,          SbRtl_TYP_DATEFLD          },
838 { u"TYP_DBFLD",                     SbxINTEGER,       CPROP_,          SbRtl_TYP_DBFLD            },
839 { u"TYP_DBNAMEFLD",                 SbxINTEGER,       CPROP_,          SbRtl_TYP_DBNAMEFLD        },
840 { u"TYP_DBNEXTSETFLD",              SbxINTEGER,       CPROP_,          SbRtl_TYP_DBNEXTSETFLD     },
841 { u"TYP_DBNUMSETFLD",               SbxINTEGER,       CPROP_,          SbRtl_TYP_DBNUMSETFLD      },
842 { u"TYP_DBSETNUMBERFLD",            SbxINTEGER,       CPROP_,          SbRtl_TYP_DBSETNUMBERFLD   },
843 { u"TYP_DDEFLD",                    SbxINTEGER,       CPROP_,          SbRtl_TYP_DDEFLD           },
844 { u"TYP_DOCINFOFLD",                SbxINTEGER,       CPROP_,          SbRtl_TYP_DOCINFOFLD       },
845 { u"TYP_DOCSTATFLD",                SbxINTEGER,       CPROP_,          SbRtl_TYP_DOCSTATFLD       },
846 { u"TYP_EXTUSERFLD",                SbxINTEGER,       CPROP_,          SbRtl_TYP_EXTUSERFLD       },
847 { u"TYP_FILENAMEFLD",               SbxINTEGER,       CPROP_,          SbRtl_TYP_FILENAMEFLD      },
848 { u"TYP_FIXDATEFLD",                SbxINTEGER,       CPROP_,          SbRtl_TYP_FIXDATEFLD       },
849 { u"TYP_FIXTIMEFLD",                SbxINTEGER,       CPROP_,          SbRtl_TYP_FIXTIMEFLD       },
850 { u"TYP_FORMELFLD",                 SbxINTEGER,       CPROP_,          SbRtl_TYP_FORMELFLD        },
851 { u"TYP_GETFLD",                    SbxINTEGER,       CPROP_,          SbRtl_TYP_GETFLD           },
852 { u"TYP_GETREFFLD",                 SbxINTEGER,       CPROP_,          SbRtl_TYP_GETREFFLD        },
853 { u"TYP_GETREFPAGEFLD",             SbxINTEGER,       CPROP_,          SbRtl_TYP_GETREFPAGEFLD    },
854 { u"TYP_HIDDENPARAFLD",             SbxINTEGER,       CPROP_,          SbRtl_TYP_HIDDENPARAFLD    },
855 { u"TYP_HIDDENTXTFLD",              SbxINTEGER,       CPROP_,          SbRtl_TYP_HIDDENTXTFLD     },
856 { u"TYP_INPUTFLD",                  SbxINTEGER,       CPROP_,          SbRtl_TYP_INPUTFLD         },
857 { u"TYP_INTERNETFLD",               SbxINTEGER,       CPROP_,          SbRtl_TYP_INTERNETFLD      },
858 { u"TYP_JUMPEDITFLD",               SbxINTEGER,       CPROP_,          SbRtl_TYP_JUMPEDITFLD      },
859 { u"TYP_MACROFLD",                  SbxINTEGER,       CPROP_,          SbRtl_TYP_MACROFLD         },
860 { u"TYP_NEXTPAGEFLD",               SbxINTEGER,       CPROP_,          SbRtl_TYP_NEXTPAGEFLD      },
861 { u"TYP_PAGENUMBERFLD",             SbxINTEGER,       CPROP_,          SbRtl_TYP_PAGENUMBERFLD    },
862 { u"TYP_POSTITFLD",                 SbxINTEGER,       CPROP_,          SbRtl_TYP_POSTITFLD        },
863 { u"TYP_PREVPAGEFLD",               SbxINTEGER,       CPROP_,          SbRtl_TYP_PREVPAGEFLD      },
864 { u"TYP_SEQFLD",                    SbxINTEGER,       CPROP_,          SbRtl_TYP_SEQFLD           },
865 { u"TYP_SETFLD",                    SbxINTEGER,       CPROP_,          SbRtl_TYP_SETFLD           },
866 { u"TYP_SETINPFLD",                 SbxINTEGER,       CPROP_,          SbRtl_TYP_SETINPFLD        },
867 { u"TYP_SETREFFLD",                 SbxINTEGER,       CPROP_,          SbRtl_TYP_SETREFFLD        },
868 { u"TYP_SETREFPAGEFLD",             SbxINTEGER,       CPROP_,          SbRtl_TYP_SETREFPAGEFLD    },
869 { u"TYP_TEMPLNAMEFLD",              SbxINTEGER,       CPROP_,          SbRtl_TYP_TEMPLNAMEFLD     },
870 { u"TYP_TIMEFLD",                   SbxINTEGER,       CPROP_,          SbRtl_TYP_TIMEFLD          },
871 { u"TYP_USERFLD",                   SbxINTEGER,       CPROP_,          SbRtl_TYP_USERFLD          },
872 { u"TYP_USRINPFLD",                 SbxINTEGER,       CPROP_,          SbRtl_TYP_USRINPFLD        },
873 
874 { u"TypeLen",                       SbxINTEGER,   1 | FUNCTION_,       SbRtl_TypeLen              },
875     arg(u"Var", SbxVARIANT),
876 
877 { u"TypeName",                      SbxSTRING,    1 | FUNCTION_,       SbRtl_TypeName             },
878     arg(u"Varname", SbxVARIANT),
879 
880 { u"UBound",                        SbxLONG,      1 | FUNCTION_,       SbRtl_UBound               },
881     arg(u"Var", SbxVARIANT),
882 
883 { u"UCase",                         SbxSTRING,    1 | FUNCTION_,       SbRtl_UCase                },
884     arg(u"String", SbxSTRING),
885 
886 { u"Unload",                        SbxNULL,      1 | FUNCTION_,       SbRtl_Unload               },
887     arg(u"Dialog", SbxOBJECT),
888 
889 { u"Val",                           SbxDOUBLE,    1 | FUNCTION_,       SbRtl_Val                  },
890     arg(u"String", SbxSTRING),
891 
892 { u"VarType",                       SbxINTEGER,   1 | FUNCTION_,       SbRtl_VarType              },
893     arg(u"Varname", SbxVARIANT),
894 
895 { u"V_EMPTY",                       SbxINTEGER,       CPROP_,          SbRtl_V_EMPTY              },
896 { u"V_NULL",                        SbxINTEGER,       CPROP_,          SbRtl_V_NULL               },
897 { u"V_INTEGER",                     SbxINTEGER,       CPROP_,          SbRtl_V_INTEGER            },
898 { u"V_LONG",                        SbxINTEGER,       CPROP_,          SbRtl_V_LONG               },
899 { u"V_SINGLE",                      SbxINTEGER,       CPROP_,          SbRtl_V_SINGLE             },
900 { u"V_DOUBLE",                      SbxINTEGER,       CPROP_,          SbRtl_V_DOUBLE             },
901 { u"V_CURRENCY",                    SbxINTEGER,       CPROP_,          SbRtl_V_CURRENCY           },
902 { u"V_DATE",                        SbxINTEGER,       CPROP_,          SbRtl_V_DATE               },
903 { u"V_STRING",                      SbxINTEGER,       CPROP_,          SbRtl_V_STRING             },
904 
905 { u"Wait",                          SbxNULL,      1 | FUNCTION_,       SbRtl_Wait                 },
906     arg(u"Milliseconds", SbxLONG),
907 
908 { u"FuncCaller",                    SbxVARIANT,       FUNCTION_,       SbRtl_FuncCaller           },
909 //#i64882#
910 { u"WaitUntil",                     SbxNULL,      1 | FUNCTION_,       SbRtl_WaitUntil            },
911     arg(u"Date", SbxDOUBLE),
912 
913 { u"Weekday",                       SbxINTEGER,   2 | FUNCTION_,       SbRtl_Weekday              },
914     arg(u"Date",           SbxDATE),
915     arg(u"Firstdayofweek", SbxINTEGER, OPT_),
916 
917 { u"WeekdayName",                   SbxSTRING,    3 | FUNCTION_ | COMPATONLY_, SbRtl_WeekdayName  },
918     arg(u"Weekday",        SbxINTEGER),
919     arg(u"Abbreviate",     SbxBOOL,    OPT_),
920     arg(u"Firstdayofweek", SbxINTEGER, OPT_),
921 
922 { u"Year",                          SbxINTEGER,   1 | FUNCTION_,       SbRtl_Year                 },
923     arg(u"Date", SbxDATE),
924 
925 { {}, SbxNULL, -1, nullptr }};  // end of the table
926 
927 static_assert(MethodsTableValid(aMethods));
928 
929 SbiStdObject::SbiStdObject( const OUString& r, StarBASIC* pb ) : SbxObject( r )
930 {
931     // #i92642: Remove default properties
932     Remove( "Name", SbxClassType::DontCare );
933     Remove( "Parent", SbxClassType::DontCare );
934 
935     SetParent( pb );
936 
937     pStdFactory.emplace();
938     SbxBase::AddFactory( &*pStdFactory );
939 
940     Insert( new SbStdClipboard );
941 }
942 
943 SbiStdObject::~SbiStdObject()
944 {
945     SbxBase::RemoveFactory( &*pStdFactory );
946     pStdFactory.reset();
947 }
948 
949 // Finding an element:
950 // It runs linearly through the method table here until an
951 // adequate method is has been found. Because of the bits in
952 // the nArgs-field the adequate instance of an SbxObjElement
953 // is created then. If the method/property hasn't been found,
954 // return NULL without error code, so that a whole chain of
955 // objects can be asked for the method/property.
956 
957 SbxVariable* SbiStdObject::Find( const OUString& rName, SbxClassType t )
958 {
959     // entered already?
960     SbxVariable* pVar = SbxObject::Find( rName, t );
961     if( !pVar )
962     {
963         // else search one
964         sal_uInt16 nHash_ = SbxVariable::MakeHashCode( rName );
965         const Method* p = aMethods;
966         bool bFound = false;
967         short nIndex = 0;
968         sal_uInt16 nSrchMask = TYPEMASK_;
969         switch( t )
970         {
971             case SbxClassType::Method:   nSrchMask = METHOD_; break;
972             case SbxClassType::Property: nSrchMask = PROPERTY_; break;
973             case SbxClassType::Object:   nSrchMask = OBJECT_; break;
974             default: break;
975         }
976         while( p->nArgs != -1 )
977         {
978             if( ( p->nArgs & nSrchMask )
979              && ( p->nHash == nHash_ )
980                 && (rName.equalsIgnoreAsciiCase(p->sName)))
981             {
982                 bFound = true;
983                 if( p->nArgs & COMPTMASK_ )
984                 {
985                     bool bCompatibility = false;
986                     SbiInstance* pInst = GetSbData()->pInst;
987                     if (pInst)
988                     {
989                         bCompatibility = pInst->IsCompatibility();
990                     }
991                     else
992                     {
993                         // No instance running => compiling a source on module level.
994                         const SbModule* pModule = GetSbData()->pCompMod;
995                         if (pModule)
996                             bCompatibility = pModule->IsVBASupport();
997                     }
998                     if ((bCompatibility && (NORMONLY_ & p->nArgs)) || (!bCompatibility && (COMPATONLY_ & p->nArgs)))
999                         bFound = false;
1000                 }
1001                 break;
1002             }
1003             nIndex += ( p->nArgs & ARGSMASK_ ) + 1;
1004             p = aMethods + nIndex;
1005         }
1006 
1007         if( bFound )
1008         {
1009             // isolate Args-fields:
1010             SbxFlagBits nAccess = static_cast<SbxFlagBits>(( p->nArgs & RWMASK_ ) >> 8);
1011             short nType   = ( p->nArgs & TYPEMASK_ );
1012             if( p->nArgs & CONST_ )
1013                 nAccess |= SbxFlagBits::Const;
1014             SbxClassType eCT = SbxClassType::Object;
1015             if( nType & PROPERTY_ )
1016             {
1017                 eCT = SbxClassType::Property;
1018             }
1019             else if( nType & METHOD_ )
1020             {
1021                 eCT = SbxClassType::Method;
1022             }
1023             pVar = Make(OUString(p->sName), eCT, p->eType, (p->nArgs & FUNCTION_) == FUNCTION_);
1024             pVar->SetUserData( nIndex + 1 );
1025             pVar->SetFlags( nAccess );
1026         }
1027     }
1028     return pVar;
1029 }
1030 
1031 // SetModified must be pinched off at the RTL
1032 void SbiStdObject::SetModified( bool )
1033 {
1034 }
1035 
1036 
1037 void SbiStdObject::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
1038 
1039 {
1040     const SbxHint* pHint = dynamic_cast<const SbxHint*>(&rHint);
1041     if( !pHint )
1042         return;
1043 
1044     SbxVariable* pVar = pHint->GetVar();
1045     SbxArray* pPar_ = pVar->GetParameters();
1046     const sal_uInt16 nCallId = static_cast<sal_uInt16>(pVar->GetUserData());
1047     if( nCallId )
1048     {
1049         const SfxHintId t = pHint->GetId();
1050         if( t == SfxHintId::BasicInfoWanted )
1051             pVar->SetInfo( GetInfo( static_cast<short>(pVar->GetUserData()) ) );
1052         else
1053         {
1054             bool bWrite = false;
1055             if( t == SfxHintId::BasicDataChanged )
1056                 bWrite = true;
1057             if( t == SfxHintId::BasicDataWanted || bWrite )
1058             {
1059                 RtlCall p = aMethods[ nCallId-1 ].pFunc;
1060                 SbxArrayRef rPar( pPar_ );
1061                 if( !pPar_ )
1062                 {
1063                     rPar = pPar_ = new SbxArray;
1064                     pPar_->Put(pVar, 0);
1065                 }
1066                 p( static_cast<StarBASIC*>(GetParent()), *pPar_, bWrite );
1067                 return;
1068             }
1069         }
1070     }
1071     SbxObject::Notify( rBC, rHint );
1072 }
1073 
1074 // building the info-structure for single elements
1075 // if nIdx = 0, don't create anything (Std-Props!)
1076 
1077 SbxInfo* SbiStdObject::GetInfo( short nIdx )
1078 {
1079     if( !nIdx )
1080         return nullptr;
1081     const Method* p = &aMethods[ --nIdx ];
1082     SbxInfo* pInfo_ = new SbxInfo;
1083     short nPar = p->nArgs & ARGSMASK_;
1084     for( short i = 0; i < nPar; i++ )
1085     {
1086         p++;
1087         SbxFlagBits nFlags_ = static_cast<SbxFlagBits>(( p->nArgs >> 8 ) & 0x03);
1088         if( p->nArgs & OPT_ )
1089         {
1090             nFlags_ |= SbxFlagBits::Optional;
1091         }
1092         pInfo_->AddParam(OUString(p->sName), p->eType, nFlags_);
1093     }
1094     return pInfo_;
1095 }
1096 
1097 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
1098