xref: /core/basic/source/runtime/stdobj.cxx (revision 62f3f3d9)
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 blacklist 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 Methods {
61     const char* pName;
62     SbxDataType eType;
63     short       nArgs;
64     RtlCall     pFunc;
65     sal_uInt16      nHash;
66 };
67 
68 }
69 
70 static Methods aMethods[] = {
71 
72 { "Abs",            SbxDOUBLE,    1 | FUNCTION_, RTLNAME(Abs),0             },
73   { "number",       SbxDOUBLE, 0,nullptr,0 },
74 { "Array",          SbxOBJECT,        FUNCTION_, RTLNAME(Array),0           },
75 { "Asc",            SbxLONG,      1 | FUNCTION_, RTLNAME(Asc),0             },
76   { "string",       SbxSTRING, 0,nullptr,0 },
77 { "AscW",           SbxLONG,      1 | FUNCTION_ | COMPATONLY_, RTLNAME(Asc),0},
78   { "string",       SbxSTRING, 0,nullptr,0 },
79 { "Atn",            SbxDOUBLE,    1 | FUNCTION_, RTLNAME(Atn),0             },
80   { "number",       SbxDOUBLE, 0,nullptr,0 },
81 { "ATTR_ARCHIVE",   SbxINTEGER,       CPROP_,    RTLNAME(ATTR_ARCHIVE),0    },
82 { "ATTR_DIRECTORY", SbxINTEGER,       CPROP_,    RTLNAME(ATTR_DIRECTORY),0  },
83 { "ATTR_HIDDEN",    SbxINTEGER,       CPROP_,    RTLNAME(ATTR_HIDDEN),0     },
84 { "ATTR_NORMAL",    SbxINTEGER,       CPROP_,    RTLNAME(ATTR_NORMAL),0     },
85 { "ATTR_READONLY",  SbxINTEGER,       CPROP_,    RTLNAME(ATTR_READONLY),0   },
86 { "ATTR_SYSTEM",    SbxINTEGER,       CPROP_,    RTLNAME(ATTR_SYSTEM),0     },
87 { "ATTR_VOLUME",    SbxINTEGER,       CPROP_,    RTLNAME(ATTR_VOLUME),0     },
88 
89 { "Beep",           SbxNULL,          FUNCTION_, RTLNAME(Beep),0            },
90 { "Blue",        SbxINTEGER,   1 | FUNCTION_ | NORMONLY_, RTLNAME(Blue),0               },
91   { "RGB-Value",     SbxLONG, 0,nullptr,0 },
92 
93 { "CallByName",     SbxVARIANT,   3 | FUNCTION_, RTLNAME(CallByName),0 },
94   { "Object",       SbxOBJECT,  0,nullptr,0 },
95   { "ProcedureName",SbxSTRING,  0,nullptr,0 },
96   { "CallType",     SbxINTEGER, 0,nullptr,0 },
97 { "CBool",          SbxBOOL,      1 | FUNCTION_, RTLNAME(CBool),0           },
98   { "expression",   SbxVARIANT, 0,nullptr,0 },
99 { "CByte",          SbxBYTE,      1 | FUNCTION_, RTLNAME(CByte),0           },
100   { "expression",   SbxVARIANT, 0,nullptr,0 },
101 { "CCur",           SbxCURRENCY,  1 | FUNCTION_, RTLNAME(CCur),0            },
102   { "expression",   SbxVARIANT, 0,nullptr,0 },
103 { "CDate",          SbxDATE,      1 | FUNCTION_, RTLNAME(CDate),0           },
104   { "expression",   SbxVARIANT, 0,nullptr,0 },
105 { "CDateFromUnoDate",   SbxDATE,      1 | FUNCTION_, RTLNAME(CDateFromUnoDate),0    },
106   { "UnoDate",      SbxOBJECT, 0,nullptr,0 },
107 { "CDateToUnoDate", SbxOBJECT,    1 | FUNCTION_, RTLNAME(CDateToUnoDate),0      },
108   { "Date",         SbxDATE, 0,nullptr,0 },
109 { "CDateFromUnoTime",   SbxDATE,      1 | FUNCTION_, RTLNAME(CDateFromUnoTime),0    },
110   { "UnoTime",      SbxOBJECT, 0,nullptr,0 },
111 { "CDateToUnoTime", SbxOBJECT,    1 | FUNCTION_, RTLNAME(CDateToUnoTime),0      },
112   { "Time",         SbxDATE, 0,nullptr,0 },
113 { "CDateFromUnoDateTime",   SbxDATE,      1 | FUNCTION_, RTLNAME(CDateFromUnoDateTime),0    },
114   { "UnoDateTime",      SbxOBJECT, 0,nullptr,0 },
115 { "CDateToUnoDateTime", SbxOBJECT,    1 | FUNCTION_, RTLNAME(CDateToUnoDateTime),0      },
116   { "DateTime",         SbxDATE, 0,nullptr,0 },
117 { "CDateFromIso",   SbxDATE,      1 | FUNCTION_, RTLNAME(CDateFromIso),0    },
118   { "IsoDate",      SbxSTRING, 0,nullptr,0 },
119 { "CDateToIso",     SbxSTRING,    1 | FUNCTION_, RTLNAME(CDateToIso),0      },
120   { "Date",         SbxDATE, 0,nullptr,0 },
121 { "CDec",           SbxDECIMAL,   1 | FUNCTION_, RTLNAME(CDec),0            },
122   { "expression",   SbxVARIANT, 0,nullptr,0 },
123 { "CDbl",           SbxDOUBLE,    1 | FUNCTION_, RTLNAME(CDbl),0            },
124   { "expression",   SbxVARIANT, 0,nullptr,0 },
125 { "CF_BITMAP",      SbxINTEGER,       CPROP_,    RTLNAME(CF_BITMAP),0       },
126 { "CF_METAFILEPICT",SbxINTEGER,       CPROP_,    RTLNAME(CF_METAFILEPICT),0 },
127 { "CF_TEXT",        SbxINTEGER,       CPROP_,    RTLNAME(CF_TEXT),0         },
128 { "ChDir",          SbxNULL,      1 | FUNCTION_, RTLNAME(ChDir),0           },
129   { "string",       SbxSTRING, 0,nullptr,0 },
130 { "ChDrive",        SbxNULL,      1 | FUNCTION_, RTLNAME(ChDrive),0         },
131   { "string",       SbxSTRING, 0,nullptr,0 },
132 
133 { "Choose",         SbxVARIANT,   2 | FUNCTION_, RTLNAME(Choose),0          },
134   { "Index",        SbxINTEGER, 0,nullptr,0 },
135   { "Expression",   SbxVARIANT, 0,nullptr,0 },
136 
137 { "Chr",            SbxSTRING,    1 | FUNCTION_, RTLNAME(Chr),0             },
138   { "string",       SbxINTEGER, 0,nullptr,0 },
139 { "ChrW",           SbxSTRING,    1 | FUNCTION_ | COMPATONLY_, RTLNAME(ChrW),0},
140   { "string",       SbxINTEGER, 0,nullptr,0 },
141 
142 { "CInt",           SbxINTEGER,   1 | FUNCTION_, RTLNAME(CInt),0            },
143   { "expression",   SbxVARIANT, 0,nullptr,0 },
144 { "CLEAR_ALLTABS",  SbxINTEGER,       CPROP_,    RTLNAME(CLEAR_ALLTABS),0   },
145 { "CLEAR_TAB",      SbxINTEGER,       CPROP_,    RTLNAME(CLEAR_TAB),0       },
146 { "CLng",           SbxLONG,      1 | FUNCTION_, RTLNAME(CLng),0            },
147   { "expression",   SbxVARIANT, 0,nullptr,0 },
148 { "CompatibilityMode",  SbxBOOL,  1 | FUNCTION_, RTLNAME(CompatibilityMode),0},
149   { "bEnable",      SbxBOOL, 0,nullptr,0 },
150 { "ConvertFromUrl", SbxSTRING,    1 | FUNCTION_, RTLNAME(ConvertFromUrl),0  },
151   { "Url",          SbxSTRING, 0,nullptr,0 },
152 { "ConvertToUrl",   SbxSTRING,    1 | FUNCTION_, RTLNAME(ConvertToUrl),0    },
153   { "SystemPath",   SbxSTRING, 0,nullptr,0 },
154 { "Cos",            SbxDOUBLE,    1 | FUNCTION_, RTLNAME(Cos),0             },
155   { "number",       SbxDOUBLE, 0,nullptr,0 },
156 { "CreateObject",   SbxOBJECT,    1 | FUNCTION_, RTLNAME( CreateObject ),0  },
157   { "class",        SbxSTRING, 0,nullptr,0 },
158 { "CreateUnoListener",SbxOBJECT,   1 | FUNCTION_, RTLNAME( CreateUnoListener ),0 },
159   { "prefix",  SbxSTRING, 0,nullptr,0 },
160   { "typename",  SbxSTRING, 0,nullptr,0 },
161 { "CreateUnoDialog",SbxOBJECT,    2 | FUNCTION_, RTLNAME( CreateUnoDialog ),0 },
162   { "dialoglibrary",SbxOBJECT, 0,nullptr,0 },
163   { "dialogname",   SbxSTRING, 0,nullptr,0 },
164 { "CreateUnoService",SbxOBJECT,   1 | FUNCTION_, RTLNAME( CreateUnoService ),0 },
165   { "servicename",  SbxSTRING, 0,nullptr,0 },
166 { "CreateUnoServiceWithArguments",SbxOBJECT,   2 | FUNCTION_, RTLNAME( CreateUnoServiceWithArguments ),0 },
167   { "servicename",  SbxSTRING, 0,nullptr,0 },
168   { "arguments",  SbxARRAY, 0,nullptr,0 },
169 { "CreateUnoStruct",SbxOBJECT,    1 | FUNCTION_, RTLNAME( CreateUnoStruct ),0 },
170   { "classname",    SbxSTRING, 0,nullptr,0 },
171 { "CreateUnoValue", SbxOBJECT,    2 | FUNCTION_, RTLNAME( CreateUnoValue ),0 },
172   { "type",         SbxSTRING, 0,nullptr,0 },
173   { "value",        SbxVARIANT, 0,nullptr,0 },
174 { "CreatePropertySet",SbxOBJECT, 1 | FUNCTION_, RTLNAME( CreatePropertySet ),0 },
175   { "values",  SbxARRAY, 0,nullptr,0 },
176 { "CSng",           SbxSINGLE,    1 | FUNCTION_, RTLNAME(CSng),0            },
177   { "expression",   SbxVARIANT, 0,nullptr,0 },
178 { "CStr",           SbxSTRING,    1 | FUNCTION_, RTLNAME(CStr),0            },
179   { "expression",   SbxVARIANT, 0,nullptr,0 },
180 { "CurDir",         SbxSTRING,    1 | FUNCTION_, RTLNAME(CurDir),0          },
181   { "string",       SbxSTRING, 0,nullptr,0 },
182 { "CVar",           SbxVARIANT,   1 | FUNCTION_, RTLNAME(CVar),0            },
183   { "expression",   SbxVARIANT, 0,nullptr,0 },
184 { "CVErr",          SbxVARIANT,   1 | FUNCTION_, RTLNAME(CVErr),0           },
185   { "expression",   SbxVARIANT, 0,nullptr,0 },
186 { "DDB",      SbxDOUBLE,      5 | FUNCTION_ | COMPATONLY_, RTLNAME(DDB),0       },
187   { "Cost",       SbxDOUBLE,  0, nullptr,0 },
188   { "Salvage",       SbxDOUBLE,  0, nullptr,0 },
189   { "Life",       SbxDOUBLE,  0, nullptr,0 },
190   { "Period",       SbxDOUBLE,  0, nullptr,0 },
191   { "Factor",     SbxVARIANT,  OPT_, nullptr,0 },
192 { "Date",           SbxDATE,          LFUNCTION_,RTLNAME(Date),0            },
193 { "DateAdd",        SbxDATE,      3 | FUNCTION_, RTLNAME(DateAdd),0         },
194   { "Interval",     SbxSTRING, 0,nullptr,0 },
195   { "Number",       SbxLONG, 0,nullptr,0 },
196   { "Date",         SbxDATE, 0,nullptr,0 },
197 { "DateDiff",       SbxDOUBLE,    5 | FUNCTION_, RTLNAME(DateDiff),0        },
198   { "Interval",     SbxSTRING, 0,nullptr,0 },
199   { "Date1",        SbxDATE, 0,nullptr,0 },
200   { "Date2",        SbxDATE, 0,nullptr,0 },
201   { "Firstdayofweek" , SbxINTEGER, OPT_,nullptr,0 },
202   { "Firstweekofyear", SbxINTEGER, OPT_,nullptr,0 },
203 { "DatePart",       SbxLONG,      4 | FUNCTION_, RTLNAME(DatePart),0        },
204   { "Interval",     SbxSTRING, 0,nullptr,0 },
205   { "Date",         SbxDATE, 0,nullptr,0 },
206   { "Firstdayofweek" , SbxINTEGER, OPT_, nullptr,0 },
207   { "Firstweekofyear", SbxINTEGER, OPT_, nullptr,0 },
208 { "DateSerial",     SbxDATE,      3 | FUNCTION_, RTLNAME(DateSerial),0      },
209   { "Year",         SbxINTEGER, 0,nullptr,0 },
210   { "Month",        SbxINTEGER, 0,nullptr,0 },
211   { "Day",          SbxINTEGER, 0,nullptr,0 },
212 { "DateValue",      SbxDATE,      1 | FUNCTION_, RTLNAME(DateValue),0       },
213   { "String",       SbxSTRING, 0,nullptr,0 },
214 { "Day",            SbxINTEGER,   1 | FUNCTION_, RTLNAME(Day),0             },
215   { "Date",         SbxDATE, 0,nullptr,0 },
216 { "Ddeexecute",     SbxNULL,   2 | FUNCTION_, RTLNAME(DDEExecute),0         },
217   { "Channel",         SbxLONG, 0,nullptr,0 },
218   { "Command",         SbxSTRING, 0,nullptr,0 },
219 { "Ddeinitiate",    SbxINTEGER,   2 | FUNCTION_, RTLNAME(DDEInitiate),0     },
220   { "Application",     SbxSTRING, 0,nullptr,0 },
221   { "Topic",           SbxSTRING, 0,nullptr,0 },
222 { "Ddepoke",        SbxNULL,   3 | FUNCTION_, RTLNAME(DDEPoke),0            },
223   { "Channel",         SbxLONG, 0,nullptr,0 },
224   { "Item",            SbxSTRING, 0,nullptr,0 },
225   { "Data",            SbxSTRING, 0,nullptr,0 },
226 { "Dderequest",     SbxSTRING,   2 | FUNCTION_, RTLNAME(DDERequest),0       },
227   { "Channel",         SbxLONG, 0,nullptr,0 },
228   { "Item",            SbxSTRING, 0,nullptr,0 },
229 { "Ddeterminate",   SbxNULL,   1 | FUNCTION_, RTLNAME(DDETerminate),0       },
230   { "Channel",         SbxLONG, 0,nullptr,0 },
231 { "Ddeterminateall",   SbxNULL,   FUNCTION_, RTLNAME(DDETerminateAll),0     },
232 { "DimArray",       SbxOBJECT,    FUNCTION_, RTLNAME(DimArray),0            },
233 { "Dir",            SbxSTRING,    2 | FUNCTION_, RTLNAME(Dir),0             },
234   { "FileSpec",     SbxSTRING,        OPT_, nullptr,0 },
235   { "attrmask",     SbxINTEGER,       OPT_, nullptr,0 },
236 { "DoEvents",       SbxINTEGER,     FUNCTION_, RTLNAME(DoEvents),0          },
237 { "DumpAllObjects", SbxEMPTY,     2 | SUB_, RTLNAME(DumpAllObjects),0       },
238   { "FileSpec",     SbxSTRING, 0,nullptr,0 },
239   { "DumpAll",      SbxINTEGER,       OPT_, nullptr,0 },
240 
241 { "Empty",        SbxVARIANT,        CPROP_,    RTLNAME(Empty),0         },
242 { "EqualUnoObjects",SbxBOOL,      2 | FUNCTION_, RTLNAME(EqualUnoObjects),0 },
243   { "Variant",      SbxVARIANT, 0,nullptr,0 },
244   { "Variant",      SbxVARIANT, 0,nullptr,0 },
245 { "EnableReschedule",   SbxNULL,  1 | FUNCTION_, RTLNAME(EnableReschedule),0},
246   { "bEnable",      SbxBOOL, 0,nullptr,0 },
247 { "Environ",            SbxSTRING,   1 | FUNCTION_, RTLNAME(Environ),0      },
248   { "Environmentstring",SbxSTRING, 0,nullptr,0 },
249 { "EOF",            SbxBOOL,      1 | FUNCTION_, RTLNAME(EOF),0             },
250   { "Channel",      SbxINTEGER, 0,nullptr,0 },
251 { "Erl",            SbxLONG,          ROPROP_,   RTLNAME( Erl ),0           },
252 { "Err",            SbxVARIANT,       RWPROP_,   RTLNAME( Err ),0           },
253 { "Error",          SbxSTRING,    1 | FUNCTION_, RTLNAME( Error ),0         },
254   { "code",         SbxLONG, 0,nullptr,0 },
255 { "Exp",            SbxDOUBLE,    1 | FUNCTION_, RTLNAME(Exp),0             },
256   { "number",       SbxDOUBLE, 0,nullptr,0 },
257 
258 { "False",          SbxBOOL,          CPROP_,    RTLNAME(False),0           },
259 { "FileAttr",       SbxINTEGER,   2 | FUNCTION_, RTLNAME(FileAttr),0        },
260   { "Channel",      SbxINTEGER, 0,nullptr,0 },
261   { "Attributes",   SbxINTEGER, 0,nullptr,0 },
262 { "FileCopy",       SbxNULL,      2 | FUNCTION_, RTLNAME(FileCopy),0        },
263   { "Source",       SbxSTRING, 0,nullptr,0 },
264   { "Destination",  SbxSTRING, 0,nullptr,0 },
265 { "FileDateTime",   SbxSTRING,    1 | FUNCTION_, RTLNAME(FileDateTime),0    },
266   { "filename",     SbxSTRING, 0,nullptr,0 },
267 { "FileExists",     SbxBOOL,   1 | FUNCTION_, RTLNAME(FileExists),0         },
268   { "filename",     SbxSTRING, 0,nullptr,0 },
269 { "FileLen",        SbxLONG,      1 | FUNCTION_, RTLNAME(FileLen),0         },
270   { "filename",     SbxSTRING, 0,nullptr,0 },
271 { "FindObject",     SbxOBJECT,    1 | FUNCTION_, RTLNAME(FindObject),0      },
272   { "Name",  SbxSTRING, 0,nullptr,0 },
273 { "FindPropertyObject",   SbxOBJECT,      2 | FUNCTION_, RTLNAME(FindPropertyObject),0 },
274   { "Object",       SbxOBJECT, 0,nullptr,0 },
275   { "Name",  SbxSTRING, 0,nullptr,0 },
276 { "Fix",            SbxDOUBLE,    1 | FUNCTION_, RTLNAME(Fix),0             },
277   { "number",       SbxDOUBLE, 0,nullptr,0 },
278 { "Format",         SbxSTRING,    2 | FUNCTION_, RTLNAME(Format),0          },
279   { "expression",   SbxVARIANT, 0,nullptr,0 },
280   { "format",       SbxSTRING,        OPT_, nullptr,0 },
281 { "FormatDateTime", SbxSTRING,    2 | FUNCTION_ | COMPATONLY_, RTLNAME(FormatDateTime),0 },
282   { "Date",         SbxDATE, 0,nullptr,0 },
283   { "NamedFormat",  SbxINTEGER,        OPT_, nullptr,0 },
284 { "FormatNumber",   SbxSTRING, 5 | FUNCTION_ | COMPATONLY_, RTLNAME(FormatNumber), 0 },
285   { "expression",                  SbxDOUBLE,  0,    nullptr, 0 },
286   { "numDigitsAfterDecimal",       SbxINTEGER, OPT_, nullptr, 0 },
287   { "includeLeadingDigit",         SbxINTEGER, OPT_, nullptr, 0 }, // vbTriState
288   { "useParensForNegativeNumbers", SbxINTEGER, OPT_, nullptr, 0 }, // vbTriState
289   { "groupDigits",                 SbxINTEGER, OPT_, nullptr, 0 }, // vbTriState
290 { "Frac",           SbxDOUBLE,    1 | FUNCTION_, RTLNAME(Frac),0            },
291   { "number",       SbxDOUBLE, 0,nullptr,0 },
292 { "FRAMEANCHORCHAR",        SbxINTEGER,       CPROP_,    RTLNAME(FRAMEANCHORCHAR),0 },
293 { "FRAMEANCHORPAGE",        SbxINTEGER,       CPROP_,    RTLNAME(FRAMEANCHORPAGE),0 },
294 { "FRAMEANCHORPARA",        SbxINTEGER,       CPROP_,    RTLNAME(FRAMEANCHORPARA),0 },
295 { "FreeFile",       SbxINTEGER,    FUNCTION_, RTLNAME(FreeFile),0           },
296 { "FreeLibrary",    SbxNULL,      1 | FUNCTION_, RTLNAME(FreeLibrary),0     },
297   { "Modulename",   SbxSTRING, 0,nullptr,0 },
298 
299 { "FV",      SbxDOUBLE,      5 | FUNCTION_ | COMPATONLY_, RTLNAME(FV),0       },
300   { "Rate",       SbxDOUBLE,  0, nullptr,0 },
301   { "NPer",       SbxDOUBLE,  0, nullptr,0 },
302   { "Pmt",       SbxDOUBLE,  0, nullptr,0 },
303   { "PV",     SbxVARIANT,  OPT_, nullptr,0 },
304   { "Due",     SbxVARIANT,  OPT_, nullptr,0 },
305 { "Get",            SbxNULL,   3 | FUNCTION_, RTLNAME(Get),0                },
306   { "filenumber",   SbxINTEGER, 0,nullptr,0 },
307   { "recordnumber", SbxLONG, 0,nullptr,0 },
308   { "variablename", SbxVARIANT, 0,nullptr,0 },
309 { "GetAttr",        SbxINTEGER,   1 | FUNCTION_, RTLNAME(GetAttr),0         },
310   { "filename",     SbxSTRING, 0,nullptr,0 },
311 { "GetDefaultContext", SbxOBJECT, 0 | FUNCTION_, RTLNAME(GetDefaultContext),0 },
312 { "GetDialogZoomFactorX",  SbxDOUBLE,     FUNCTION_,RTLNAME(GetDialogZoomFactorX),0 },
313 { "GetDialogZoomFactorY",  SbxDOUBLE,     FUNCTION_,RTLNAME(GetDialogZoomFactorY),0 },
314 { "GetGUIType",  SbxINTEGER,     FUNCTION_,RTLNAME(GetGUIType),0            },
315 { "GetGUIVersion",  SbxLONG,     FUNCTION_,RTLNAME(GetGUIVersion),0         },
316 { "GetPathSeparator",  SbxSTRING,     FUNCTION_,RTLNAME(GetPathSeparator),0 },
317 { "GetProcessServiceManager", SbxOBJECT, 0 | FUNCTION_, RTLNAME(GetProcessServiceManager),0 },
318 { "GetSolarVersion",  SbxLONG,     FUNCTION_,RTLNAME(GetSolarVersion),0     },
319 { "GetSystemTicks",  SbxLONG,      FUNCTION_,RTLNAME(GetSystemTicks),0      },
320 { "GetSystemType",  SbxINTEGER,    FUNCTION_,RTLNAME(GetSystemType),0       },
321 { "GlobalScope",    SbxOBJECT,     FUNCTION_,RTLNAME(GlobalScope),0         },
322 { "Green",          SbxINTEGER,   1 | FUNCTION_ | NORMONLY_, RTLNAME(Green),0           },
323   { "RGB-Value",     SbxLONG, 0,nullptr,0 },
324 
325 { "HasUnoInterfaces",   SbxBOOL,  1 | FUNCTION_, RTLNAME(HasUnoInterfaces),0},
326   { "InterfaceName",SbxSTRING, 0,nullptr,0 },
327 { "Hex",            SbxSTRING,    1 | FUNCTION_, RTLNAME(Hex),0             },
328   { "number",       SbxLONG, 0,nullptr,0 },
329 { "Hour",           SbxINTEGER,   1 | FUNCTION_, RTLNAME(Hour),0            },
330   { "Date",         SbxDATE, 0,nullptr,0 },
331 
332 { "IDABORT",        SbxINTEGER,       CPROP_,    RTLNAME(IDABORT),0         },
333 { "IDCANCEL",       SbxINTEGER,       CPROP_,    RTLNAME(IDCANCEL),0        },
334 { "IDNO",           SbxINTEGER,       CPROP_,    RTLNAME(IDNO),0            },
335 { "IDOK",           SbxINTEGER,       CPROP_,    RTLNAME(IDOK),0            },
336 { "IDRETRY",        SbxINTEGER,       CPROP_,    RTLNAME(IDRETRY),0         },
337 { "IDYES",          SbxINTEGER,       CPROP_,    RTLNAME(IDYES),0           },
338 
339 { "Iif",            SbxVARIANT,   3 | FUNCTION_, RTLNAME(Iif),0             },
340   { "Bool",         SbxBOOL, 0,nullptr,0 },
341   { "Variant1",     SbxVARIANT, 0,nullptr,0 },
342   { "Variant2",     SbxVARIANT, 0,nullptr,0 },
343 
344 { "Input",          SbxSTRING,    2 | FUNCTION_ | COMPATONLY_, RTLNAME(Input),0},
345   { "Number",       SbxLONG, 0,nullptr,0 },
346   { "FileNumber",   SbxLONG, 0,nullptr,0 },
347 { "InputBox",       SbxSTRING,    5 | FUNCTION_, RTLNAME(InputBox),0        },
348   { "Prompt",       SbxSTRING, 0,nullptr,0 },
349   { "Title",        SbxSTRING,        OPT_, nullptr,0 },
350   { "Default",      SbxSTRING,        OPT_, nullptr,0 },
351   { "XPosTwips",    SbxLONG,          OPT_, nullptr,0 },
352   { "YPosTwips",    SbxLONG,          OPT_, nullptr,0 },
353 { "InStr",          SbxLONG,      4 | FUNCTION_, RTLNAME(InStr),0           },
354   { "Start",        SbxSTRING,        OPT_, nullptr,0 },
355   { "String1",      SbxSTRING, 0,nullptr,0 },
356   { "String2",      SbxSTRING, 0,nullptr,0 },
357   { "Compare",      SbxINTEGER,       OPT_, nullptr,0 },
358 { "InStrRev",       SbxLONG,      4 | FUNCTION_ | COMPATONLY_, RTLNAME(InStrRev),0},
359   { "String1",      SbxSTRING, 0,nullptr,0 },
360   { "String2",      SbxSTRING, 0,nullptr,0 },
361   { "Start",        SbxSTRING,        OPT_, nullptr,0 },
362   { "Compare",      SbxINTEGER,       OPT_, nullptr,0 },
363 { "Int",            SbxDOUBLE,    1 | FUNCTION_, RTLNAME(Int),0             },
364   { "number",       SbxDOUBLE, 0,nullptr,0 },
365 { "IPmt",      SbxDOUBLE,      6 | FUNCTION_ | COMPATONLY_, RTLNAME(IPmt),0       },
366   { "Rate",       SbxDOUBLE,  0, nullptr,0 },
367   { "Per",       SbxDOUBLE,  0, nullptr,0 },
368   { "NPer",       SbxDOUBLE,  0, nullptr,0 },
369   { "PV",     SbxDOUBLE,  0, nullptr,0 },
370   { "FV",     SbxVARIANT,  OPT_, nullptr,0 },
371   { "Due",     SbxVARIANT,  OPT_, nullptr,0 },
372 { "IRR",      SbxDOUBLE,      2 | FUNCTION_ | COMPATONLY_, RTLNAME(IRR),0       },
373   { "ValueArray",       SbxARRAY,  0, nullptr,0 },
374   { "Guess",       SbxVARIANT,  OPT_, nullptr,0 },
375 { "IsArray",        SbxBOOL,      1 | FUNCTION_, RTLNAME(IsArray),0         },
376   { "Variant",      SbxVARIANT, 0,nullptr,0 },
377 { "IsDate",         SbxBOOL,      1 | FUNCTION_, RTLNAME(IsDate),0          },
378   { "Variant",      SbxVARIANT, 0,nullptr,0 },
379 { "IsEmpty",        SbxBOOL,      1 | FUNCTION_, RTLNAME(IsEmpty),0         },
380   { "Variant",      SbxVARIANT, 0,nullptr,0 },
381 { "IsError",        SbxBOOL,      1 | FUNCTION_, RTLNAME(IsError),0         },
382   { "Variant",      SbxVARIANT, 0,nullptr,0 },
383 { "IsMissing",        SbxBOOL,      1 | FUNCTION_, RTLNAME(IsMissing),0     },
384   { "Variant",      SbxVARIANT, 0,nullptr,0 },
385 { "IsNull",         SbxBOOL,      1 | FUNCTION_, RTLNAME(IsNull),0          },
386   { "Variant",      SbxVARIANT, 0,nullptr,0 },
387 { "IsNumeric",      SbxBOOL,      1 | FUNCTION_, RTLNAME(IsNumeric),0       },
388   { "Variant",      SbxVARIANT, 0,nullptr,0 },
389 { "IsObject",       SbxBOOL,      1 | FUNCTION_, RTLNAME(IsObject),0        },
390   { "Variant",      SbxVARIANT, 0,nullptr,0 },
391 { "IsUnoStruct",    SbxBOOL,      1 | FUNCTION_, RTLNAME(IsUnoStruct),0     },
392   { "Variant",      SbxVARIANT, 0,nullptr,0 },
393 { "Join",           SbxSTRING,      2 | FUNCTION_, RTLNAME(Join),0          },
394   { "list",         SbxOBJECT, 0,nullptr,0 },
395   { "delimiter",    SbxSTRING, 0,nullptr,0 },
396 { "Kill",           SbxNULL,      1 | FUNCTION_, RTLNAME(Kill),0            },
397   { "filespec",     SbxSTRING, 0,nullptr,0 },
398 { "LBound",         SbxLONG,      1 | FUNCTION_, RTLNAME(LBound),0          },
399   { "Variant",      SbxVARIANT, 0,nullptr,0 },
400 { "LCase",          SbxSTRING,    1 | FUNCTION_, RTLNAME(LCase),0           },
401   { "string",       SbxSTRING, 0,nullptr,0 },
402 { "Left",           SbxSTRING,    2 | FUNCTION_, RTLNAME(Left),0            },
403   { "String",       SbxSTRING, 0,nullptr,0 },
404   { "Count",        SbxLONG, 0,nullptr,0 },
405 { "Len",            SbxLONG,      1 | FUNCTION_, RTLNAME(Len),0             },
406   { "StringOrVariant", SbxVARIANT, 0,nullptr,0 },
407 { "LenB",           SbxLONG,      1 | FUNCTION_, RTLNAME(Len),0             },
408   { "StringOrVariant", SbxVARIANT, 0,nullptr,0 },
409 { "Load",           SbxNULL,      1 | FUNCTION_, RTLNAME(Load),0            },
410   { "object",       SbxOBJECT, 0,nullptr,0 },
411 { "LoadPicture",    SbxOBJECT,    1 | FUNCTION_, RTLNAME(LoadPicture),0     },
412   { "string",       SbxSTRING, 0,nullptr,0 },
413 { "Loc",            SbxLONG,      1 | FUNCTION_, RTLNAME(Loc),0             },
414   { "Channel",      SbxINTEGER, 0,nullptr,0 },
415 { "Lof",            SbxLONG,      1 | FUNCTION_, RTLNAME(Lof),0             },
416   { "Channel",      SbxINTEGER, 0,nullptr,0 },
417 { "Log",            SbxDOUBLE,    1 | FUNCTION_, RTLNAME(Log),0             },
418   { "number",       SbxDOUBLE, 0,nullptr,0 },
419 { "LTrim",          SbxSTRING,    1 | FUNCTION_, RTLNAME(LTrim),0           },
420   { "string",       SbxSTRING, 0,nullptr,0 },
421 
422 { "MB_ABORTRETRYIGNORE", SbxINTEGER,  CPROP_,    RTLNAME(MB_ABORTRETRYIGNORE),0},
423 { "MB_APPLMODAL",   SbxINTEGER,       CPROP_,    RTLNAME(MB_APPLMODAL),0    },
424 { "MB_DEFBUTTON1",  SbxINTEGER,       CPROP_,    RTLNAME(MB_DEFBUTTON1),0   },
425 { "MB_DEFBUTTON2",  SbxINTEGER,       CPROP_,    RTLNAME(MB_DEFBUTTON2),0   },
426 { "MB_DEFBUTTON3",  SbxINTEGER,       CPROP_,    RTLNAME(MB_DEFBUTTON3),0   },
427 { "MB_ICONEXCLAMATION", SbxINTEGER,   CPROP_,    RTLNAME(MB_ICONEXCLAMATION),0},
428 { "MB_ICONINFORMATION", SbxINTEGER,   CPROP_,    RTLNAME(MB_ICONINFORMATION),0},
429 { "MB_ICONQUESTION",SbxINTEGER,       CPROP_,    RTLNAME(MB_ICONQUESTION),0 },
430 { "MB_ICONSTOP",    SbxINTEGER,       CPROP_,    RTLNAME(MB_ICONSTOP),0     },
431 { "MB_OK",          SbxINTEGER,       CPROP_,    RTLNAME(MB_OK),0           },
432 { "MB_OKCANCEL",    SbxINTEGER,       CPROP_,    RTLNAME(MB_OKCANCEL),0     },
433 { "MB_RETRYCANCEL", SbxINTEGER,       CPROP_,    RTLNAME(MB_RETRYCANCEL),0  },
434 { "MB_SYSTEMMODAL", SbxINTEGER,       CPROP_,    RTLNAME(MB_SYSTEMMODAL),0  },
435 { "MB_YESNO",       SbxINTEGER,       CPROP_,    RTLNAME(MB_YESNO),0        },
436 { "MB_YESNOCANCEL", SbxINTEGER,       CPROP_,    RTLNAME(MB_YESNOCANCEL),0  },
437 
438 { "Me",             SbxOBJECT,    0 | FUNCTION_ | COMPATONLY_, RTLNAME(Me),0 },
439 { "Mid",            SbxSTRING,    3 | LFUNCTION_,RTLNAME(Mid),0             },
440   { "String",       SbxSTRING, 0,nullptr,0 },
441   { "StartPos",     SbxLONG, 0,nullptr,0 },
442   { "Length",       SbxLONG,          OPT_, nullptr,0 },
443 { "Minute",         SbxINTEGER,   1 | FUNCTION_, RTLNAME(Minute),0          },
444   { "Date",         SbxDATE, 0,nullptr,0 },
445 { "MIRR",      SbxDOUBLE,      2 | FUNCTION_ | COMPATONLY_, RTLNAME(MIRR),0       },
446   { "ValueArray",       SbxARRAY,  0, nullptr,0 },
447   { "FinanceRate",       SbxDOUBLE,  0, nullptr,0 },
448   { "ReinvestRate",       SbxDOUBLE,  0, nullptr,0 },
449 { "MkDir",          SbxNULL,      1 | FUNCTION_, RTLNAME(MkDir),0           },
450   { "pathname",     SbxSTRING, 0,nullptr,0 },
451 { "Month",          SbxINTEGER,   1 | FUNCTION_, RTLNAME(Month),0           },
452   { "Date",         SbxDATE, 0,nullptr,0 },
453 { "MonthName",      SbxSTRING,    2 | FUNCTION_ | COMPATONLY_, RTLNAME(MonthName),0 },
454   { "Month",        SbxINTEGER, 0,nullptr,0 },
455   { "Abbreviate",   SbxBOOL,          OPT_, nullptr,0 },
456 { "MsgBox",         SbxINTEGER,    5 | FUNCTION_, RTLNAME(MsgBox),0         },
457   { "Prompt",       SbxSTRING, 0,nullptr,0 },
458   { "Buttons",      SbxINTEGER,       OPT_, nullptr,0 },
459   { "Title",        SbxSTRING,        OPT_, nullptr,0 },
460   { "Helpfile",     SbxSTRING,        OPT_, nullptr,0 },
461   { "Context",      SbxINTEGER,       OPT_, nullptr,0 },
462 
463 { "Nothing",        SbxOBJECT,        CPROP_,    RTLNAME(Nothing),0         },
464 { "Now",            SbxDATE,          FUNCTION_, RTLNAME(Now),0             },
465 { "NPer",      SbxDOUBLE,      5 | FUNCTION_ | COMPATONLY_, RTLNAME(NPer),0       },
466   { "Rate",       SbxDOUBLE,  0, nullptr,0 },
467   { "Pmt",       SbxDOUBLE,  0, nullptr,0 },
468   { "PV",       SbxDOUBLE,  0, nullptr,0 },
469   { "FV",     SbxVARIANT,  OPT_, nullptr,0 },
470   { "Due",     SbxVARIANT,  OPT_, nullptr,0 },
471 { "NPV",      SbxDOUBLE,      2 | FUNCTION_ | COMPATONLY_, RTLNAME(NPV),0       },
472   { "Rate",       SbxDOUBLE,  0, nullptr,0 },
473   { "ValueArray",       SbxARRAY,  0, nullptr,0 },
474 { "Null",           SbxNULL,          CPROP_,    RTLNAME(Null),0            },
475 
476 { "Oct",            SbxSTRING,    1 | FUNCTION_, RTLNAME(Oct),0             },
477   { "number",       SbxLONG, 0,nullptr,0 },
478 
479 { "Partition",      SbxSTRING,    4 | FUNCTION_, RTLNAME(Partition),0       },
480   { "number",       SbxLONG,    0,nullptr,0 },
481   { "start",        SbxLONG,    0,nullptr,0 },
482   { "stop",         SbxLONG,    0,nullptr,0 },
483   { "interval",     SbxLONG,    0,nullptr,0 },
484 { "Pi",             SbxDOUBLE,        CPROP_,    RTLNAME(PI),0              },
485 
486 { "Pmt",      SbxDOUBLE,      5 | FUNCTION_ | COMPATONLY_, RTLNAME(Pmt),0       },
487   { "Rate",       SbxDOUBLE,  0, nullptr,0 },
488   { "NPer",       SbxDOUBLE,  0, nullptr,0 },
489   { "PV",     SbxDOUBLE,  0, nullptr,0 },
490   { "FV",     SbxVARIANT,  OPT_, nullptr,0 },
491   { "Due",     SbxVARIANT,  OPT_, nullptr,0 },
492 
493 { "PPmt",      SbxDOUBLE,      6 | FUNCTION_ | COMPATONLY_, RTLNAME(PPmt),0       },
494   { "Rate",       SbxDOUBLE,  0, nullptr,0 },
495   { "Per",       SbxDOUBLE,  0, nullptr,0 },
496   { "NPer",       SbxDOUBLE,  0, nullptr,0 },
497   { "PV",     SbxDOUBLE,  0, nullptr,0 },
498   { "FV",     SbxVARIANT,  OPT_, nullptr,0 },
499   { "Due",     SbxVARIANT,  OPT_, nullptr,0 },
500 
501 { "Put",            SbxNULL,   3 | FUNCTION_, RTLNAME(Put),0                },
502   { "filenumber",   SbxINTEGER, 0,nullptr,0 },
503   { "recordnumber", SbxLONG, 0,nullptr,0 },
504   { "variablename", SbxVARIANT, 0,nullptr,0 },
505 
506 { "PV",      SbxDOUBLE,      5 | FUNCTION_ | COMPATONLY_, RTLNAME(PV),0       },
507   { "Rate",       SbxDOUBLE,  0, nullptr,0 },
508   { "NPer",       SbxDOUBLE,  0, nullptr,0 },
509   { "Pmt",     SbxDOUBLE,  0, nullptr,0 },
510   { "FV",     SbxVARIANT,  OPT_, nullptr,0 },
511   { "Due",     SbxVARIANT,  OPT_, nullptr,0 },
512 
513 { "QBColor",        SbxLONG,      1 | FUNCTION_, RTLNAME(QBColor),0         },
514   { "number",       SbxINTEGER, 0,nullptr,0 },
515 
516 { "Randomize",      SbxNULL,      1 | FUNCTION_, RTLNAME(Randomize),0       },
517   { "Number",       SbxDOUBLE,        OPT_, nullptr,0 },
518 { "Rate",      SbxDOUBLE,      6 | FUNCTION_ | COMPATONLY_, RTLNAME(Rate),0       },
519   { "NPer",       SbxDOUBLE,  0, nullptr,0 },
520   { "Pmt",       SbxDOUBLE,  0, nullptr,0 },
521   { "PV",       SbxDOUBLE,  0, nullptr,0 },
522   { "FV",       SbxVARIANT,  OPT_, nullptr,0 },
523   { "Due",     SbxVARIANT,  OPT_, nullptr,0 },
524   { "Guess",    SbxVARIANT,  OPT_, nullptr,0 },
525 { "Red",        SbxINTEGER,   1 | FUNCTION_ | NORMONLY_, RTLNAME(Red),0                 },
526   { "RGB-Value",     SbxLONG, 0,nullptr,0 },
527 { "Reset",          SbxNULL,      0 | FUNCTION_, RTLNAME(Reset),0           },
528 { "ResolvePath",    SbxSTRING,    1 | FUNCTION_, RTLNAME(ResolvePath),0     },
529   { "Path",         SbxSTRING, 0,nullptr,0 },
530 { "RGB",            SbxLONG,      3 | FUNCTION_, RTLNAME(RGB),0             },
531   { "Red",          SbxINTEGER, 0,nullptr,0 },
532   { "Green",        SbxINTEGER, 0,nullptr,0 },
533   { "Blue",         SbxINTEGER, 0,nullptr,0 },
534 { "Replace",        SbxSTRING,    6 | FUNCTION_, RTLNAME(Replace),0         },
535   { "Expression",   SbxSTRING, 0,nullptr,0 },
536   { "Find",         SbxSTRING, 0,nullptr,0 },
537   { "Replace",      SbxSTRING, 0,nullptr,0 },
538   { "Start",        SbxINTEGER,     OPT_, nullptr,0 },
539   { "Count",        SbxINTEGER,     OPT_, nullptr,0 },
540   { "Compare",      SbxINTEGER,     OPT_, nullptr,0 },
541 { "Right",          SbxSTRING,    2 | FUNCTION_, RTLNAME(Right),0           },
542   { "String",       SbxSTRING, 0,nullptr,0 },
543   { "Count",        SbxLONG, 0,nullptr,0 },
544 { "RmDir",          SbxNULL,      1 | FUNCTION_, RTLNAME(RmDir),0           },
545   { "pathname",     SbxSTRING, 0,nullptr,0 },
546 { "Round",          SbxDOUBLE,    2 | FUNCTION_ | COMPATONLY_, RTLNAME(Round),0},
547   { "Expression",   SbxDOUBLE, 0,nullptr,0 },
548   { "Numdecimalplaces", SbxINTEGER,   OPT_, nullptr,0 },
549 { "Rnd",            SbxDOUBLE,    1 | FUNCTION_, RTLNAME(Rnd),0             },
550   { "Number",       SbxDOUBLE,        OPT_, nullptr,0 },
551 { "RTL",            SbxOBJECT,    0 | FUNCTION_ | COMPATONLY_, RTLNAME(RTL),0},
552 { "RTrim",          SbxSTRING,    1 | FUNCTION_, RTLNAME(RTrim),0           },
553   { "string",       SbxSTRING, 0,nullptr,0 },
554 
555 { "SavePicture",    SbxNULL,      2 | FUNCTION_, RTLNAME(SavePicture),0     },
556   { "object",       SbxOBJECT, 0,nullptr,0 },
557   { "string",       SbxSTRING, 0,nullptr,0 },
558 { "Second",         SbxINTEGER,   1 | FUNCTION_, RTLNAME(Second),0          },
559   { "Date",         SbxDATE, 0,nullptr,0 },
560 { "Seek",           SbxLONG,      1 | FUNCTION_, RTLNAME(Seek),0            },
561   { "Channel",      SbxINTEGER, 0,nullptr,0 },
562 { "SendKeys",       SbxNULL,      2 | FUNCTION_, RTLNAME(SendKeys),0        },
563   { "String",       SbxSTRING, 0,nullptr,0 },
564   { "Wait",         SbxBOOL,          OPT_, nullptr,0 },
565 { "SetAttr",        SbxNULL,      2 | FUNCTION_, RTLNAME(SetAttr),0         },
566   { "File"  ,       SbxSTRING, 0,nullptr,0 },
567   { "Attributes",   SbxINTEGER, 0,nullptr,0 },
568 { "SET_OFF",        SbxINTEGER,       CPROP_,    RTLNAME(SET_OFF),0         },
569 { "SET_ON",         SbxINTEGER,       CPROP_,    RTLNAME(SET_ON),0          },
570 { "SET_TAB",        SbxINTEGER,       CPROP_,    RTLNAME(SET_TAB),0         },
571 { "Sgn",            SbxINTEGER,   1 | FUNCTION_, RTLNAME(Sgn),0             },
572   { "number",       SbxDOUBLE, 0,nullptr,0 },
573 { "Shell",          SbxLONG,      2 | FUNCTION_, RTLNAME(Shell),0           },
574   { "Commandstring",SbxSTRING, 0,nullptr,0 },
575   { "WindowStyle",  SbxINTEGER,       OPT_, nullptr,0 },
576 { "Sin",            SbxDOUBLE,    1 | FUNCTION_, RTLNAME(Sin),0             },
577   { "number",       SbxDOUBLE, 0,nullptr,0 },
578 { "SLN",            SbxDOUBLE,    2 |  FUNCTION_ | COMPATONLY_, RTLNAME(SLN),0             },
579   { "Cost",       SbxDOUBLE, 0,nullptr,0 },
580   { "Double",       SbxDOUBLE, 0,nullptr,0 },
581   { "Life",       SbxDOUBLE, 0,nullptr,0 },
582 { "SYD",            SbxDOUBLE,    2 |  FUNCTION_ | COMPATONLY_, RTLNAME(SYD),0             },
583   { "Cost",       SbxDOUBLE, 0,nullptr,0 },
584   { "Salvage",       SbxDOUBLE, 0,nullptr,0 },
585   { "Life",       SbxDOUBLE, 0,nullptr,0 },
586   { "Period",       SbxDOUBLE, 0,nullptr,0 },
587 { "Space",          SbxSTRING,      1 | FUNCTION_, RTLNAME(Space),0         },
588   { "string",       SbxLONG, 0,nullptr,0 },
589 { "Spc",            SbxSTRING,      1 | FUNCTION_, RTLNAME(Spc),0           },
590   { "Count",        SbxLONG, 0,nullptr,0 },
591 { "Split",          SbxOBJECT,      3 | FUNCTION_, RTLNAME(Split),0         },
592   { "expression",   SbxSTRING, 0,nullptr,0 },
593   { "delimiter",    SbxSTRING, 0,nullptr,0 },
594   { "count",        SbxLONG, 0,nullptr,0 },
595 { "Sqr",            SbxDOUBLE,    1 | FUNCTION_, RTLNAME(Sqr),0             },
596   { "number",       SbxDOUBLE, 0,nullptr,0 },
597 { "Str",            SbxSTRING,    1 | FUNCTION_, RTLNAME(Str),0             },
598   { "number",       SbxDOUBLE, 0,nullptr,0 },
599 { "StrComp",        SbxINTEGER,   3 | FUNCTION_, RTLNAME(StrComp),0         },
600   { "String1",      SbxSTRING, 0,nullptr,0 },
601   { "String2",      SbxSTRING, 0,nullptr,0 },
602   { "Compare",      SbxINTEGER,       OPT_, nullptr,0 },
603 { "StrConv",        SbxOBJECT,   3 | FUNCTION_, RTLNAME(StrConv),0          },
604   { "String",       SbxSTRING, 0,nullptr,0 },
605   { "Conversion",   SbxSTRING, 0,nullptr,0 },
606   { "LCID",         SbxINTEGER, OPT_,nullptr,0 },
607 { "String",         SbxSTRING,    2 | FUNCTION_, RTLNAME(String),0          },
608   { "Count",        SbxLONG, 0,nullptr,0 },
609   { "Filler",       SbxVARIANT, 0,nullptr,0 },
610 { "StrReverse",     SbxSTRING,    1 | FUNCTION_ | COMPATONLY_, RTLNAME(StrReverse),0 },
611   { "String1",      SbxSTRING, 0,nullptr,0 },
612 { "Switch",         SbxVARIANT,   2 | FUNCTION_, RTLNAME(Switch),0          },
613   { "Expression",   SbxVARIANT, 0,nullptr,0 },
614   { "Value",        SbxVARIANT, 0,nullptr,0 },
615 { "Tab",            SbxSTRING,    1 | FUNCTION_, RTLNAME(Tab),0             },
616   { "Count",        SbxLONG, 0,nullptr,0 },
617 { "Tan",            SbxDOUBLE,    1 | FUNCTION_, RTLNAME(Tan),0             },
618   { "number",       SbxDOUBLE, 0,nullptr,0 },
619 { "Time",           SbxVARIANT,       LFUNCTION_,RTLNAME(Time),0            },
620 { "Timer",          SbxDATE,          FUNCTION_, RTLNAME(Timer),0           },
621 { "TimeSerial",     SbxDATE,      3 | FUNCTION_, RTLNAME(TimeSerial),0      },
622   { "Hour",         SbxLONG, 0,nullptr,0 },
623   { "Minute",       SbxLONG, 0,nullptr,0 },
624   { "Second",       SbxLONG, 0,nullptr,0 },
625 { "TimeValue",      SbxDATE,      1 | FUNCTION_, RTLNAME(TimeValue),0       },
626   { "String",       SbxSTRING, 0,nullptr,0 },
627 { "TOGGLE",         SbxINTEGER,       CPROP_,    RTLNAME(TOGGLE),0          },
628 { "Trim",           SbxSTRING,    1 | FUNCTION_, RTLNAME(Trim),0            },
629   { "String",       SbxSTRING, 0,nullptr,0 },
630 { "True",           SbxBOOL,          CPROP_,    RTLNAME(True),0            },
631 { "TwipsPerPixelX", SbxLONG,          FUNCTION_, RTLNAME(TwipsPerPixelX),0  },
632 { "TwipsPerPixelY", SbxLONG,          FUNCTION_, RTLNAME(TwipsPerPixelY),0  },
633 
634 { "TYP_AUTHORFLD",          SbxINTEGER,       CPROP_,    RTLNAME(TYP_AUTHORFLD),0       },
635 { "TYP_CHAPTERFLD",         SbxINTEGER,       CPROP_,    RTLNAME(TYP_CHAPTERFLD),0      },
636 { "TYP_CONDTXTFLD",         SbxINTEGER,       CPROP_,    RTLNAME(TYP_CONDTXTFLD),0      },
637 { "TYP_DATEFLD",            SbxINTEGER,       CPROP_,    RTLNAME(TYP_DATEFLD),0         },
638 { "TYP_DBFLD",              SbxINTEGER,       CPROP_,    RTLNAME(TYP_DBFLD),0           },
639 { "TYP_DBNAMEFLD",          SbxINTEGER,       CPROP_,    RTLNAME(TYP_DBNAMEFLD),0       },
640 { "TYP_DBNEXTSETFLD",       SbxINTEGER,       CPROP_,    RTLNAME(TYP_DBNEXTSETFLD),0    },
641 { "TYP_DBNUMSETFLD",        SbxINTEGER,       CPROP_,    RTLNAME(TYP_DBNUMSETFLD),0     },
642 { "TYP_DBSETNUMBERFLD",     SbxINTEGER,       CPROP_,    RTLNAME(TYP_DBSETNUMBERFLD),0  },
643 { "TYP_DDEFLD",             SbxINTEGER,       CPROP_,    RTLNAME(TYP_DDEFLD),0          },
644 { "TYP_DOCINFOFLD",         SbxINTEGER,       CPROP_,    RTLNAME(TYP_DOCINFOFLD),0      },
645 { "TYP_DOCSTATFLD",         SbxINTEGER,       CPROP_,    RTLNAME(TYP_DOCSTATFLD),0      },
646 { "TYP_EXTUSERFLD",         SbxINTEGER,       CPROP_,    RTLNAME(TYP_EXTUSERFLD),0      },
647 { "TYP_FILENAMEFLD",        SbxINTEGER,       CPROP_,    RTLNAME(TYP_FILENAMEFLD),0     },
648 { "TYP_FIXDATEFLD",         SbxINTEGER,       CPROP_,    RTLNAME(TYP_FIXDATEFLD),0      },
649 { "TYP_FIXTIMEFLD",         SbxINTEGER,       CPROP_,    RTLNAME(TYP_FIXTIMEFLD),0      },
650 { "TYP_FORMELFLD",          SbxINTEGER,       CPROP_,    RTLNAME(TYP_FORMELFLD),0       },
651 { "TYP_GETFLD",             SbxINTEGER,       CPROP_,    RTLNAME(TYP_GETFLD),0          },
652 { "TYP_GETREFFLD",          SbxINTEGER,       CPROP_,    RTLNAME(TYP_GETREFFLD),0       },
653 { "TYP_GETREFPAGEFLD",      SbxINTEGER,       CPROP_,    RTLNAME(TYP_GETREFPAGEFLD),0   },
654 { "TYP_HIDDENPARAFLD",      SbxINTEGER,       CPROP_,    RTLNAME(TYP_HIDDENPARAFLD),0   },
655 { "TYP_HIDDENTXTFLD",       SbxINTEGER,       CPROP_,    RTLNAME(TYP_HIDDENTXTFLD),0    },
656 { "TYP_INPUTFLD",           SbxINTEGER,       CPROP_,    RTLNAME(TYP_INPUTFLD),0        },
657 { "TYP_INTERNETFLD",        SbxINTEGER,       CPROP_,    RTLNAME(TYP_INTERNETFLD),0     },
658 { "TYP_JUMPEDITFLD",        SbxINTEGER,       CPROP_,    RTLNAME(TYP_JUMPEDITFLD),0     },
659 { "TYP_MACROFLD",           SbxINTEGER,       CPROP_,    RTLNAME(TYP_MACROFLD),0        },
660 { "TYP_NEXTPAGEFLD",        SbxINTEGER,       CPROP_,    RTLNAME(TYP_NEXTPAGEFLD),0     },
661 { "TYP_PAGENUMBERFLD",      SbxINTEGER,       CPROP_,    RTLNAME(TYP_PAGENUMBERFLD),0   },
662 { "TYP_POSTITFLD",          SbxINTEGER,       CPROP_,    RTLNAME(TYP_POSTITFLD),0       },
663 { "TYP_PREVPAGEFLD",        SbxINTEGER,       CPROP_,    RTLNAME(TYP_PREVPAGEFLD),0     },
664 { "TYP_SEQFLD",             SbxINTEGER,       CPROP_,    RTLNAME(TYP_SEQFLD),0          },
665 { "TYP_SETFLD",             SbxINTEGER,       CPROP_,    RTLNAME(TYP_SETFLD),0          },
666 { "TYP_SETINPFLD",          SbxINTEGER,       CPROP_,    RTLNAME(TYP_SETINPFLD),0       },
667 { "TYP_SETREFFLD",          SbxINTEGER,       CPROP_,    RTLNAME(TYP_SETREFFLD),0       },
668 { "TYP_SETREFPAGEFLD",      SbxINTEGER,       CPROP_,    RTLNAME(TYP_SETREFPAGEFLD),0   },
669 { "TYP_TEMPLNAMEFLD",           SbxINTEGER,       CPROP_,    RTLNAME(TYP_TEMPLNAMEFLD),0},
670 { "TYP_TIMEFLD",        SbxINTEGER,       CPROP_,    RTLNAME(TYP_TIMEFLD),0             },
671 { "TYP_USERFLD",        SbxINTEGER,       CPROP_,    RTLNAME(TYP_USERFLD),0             },
672 { "TYP_USRINPFLD",          SbxINTEGER,       CPROP_,    RTLNAME(TYP_USRINPFLD),0       },
673 
674 { "TypeLen",        SbxINTEGER,    1 | FUNCTION_, RTLNAME(TypeLen),0        },
675   { "Var",          SbxVARIANT, 0,nullptr,0 },
676 { "TypeName",       SbxSTRING,    1 | FUNCTION_, RTLNAME(TypeName),0        },
677   { "Var",          SbxVARIANT, 0,nullptr,0 },
678 
679 { "UBound",         SbxLONG,      1 | FUNCTION_, RTLNAME(UBound),0          },
680   { "Var",          SbxVARIANT, 0,nullptr,0 },
681 { "UCase",          SbxSTRING,    1 | FUNCTION_, RTLNAME(UCase),0           },
682   { "String",       SbxSTRING, 0,nullptr,0 },
683 { "Unload",         SbxNULL,      1 | FUNCTION_, RTLNAME(Unload),0          },
684   { "Dialog",       SbxOBJECT, 0,nullptr,0 },
685 
686 { "Val",            SbxDOUBLE,    1 | FUNCTION_, RTLNAME(Val),0             },
687   { "String",       SbxSTRING, 0,nullptr,0 },
688 { "VarType",        SbxINTEGER,   1 | FUNCTION_, RTLNAME(VarType),0         },
689   { "Var",          SbxVARIANT, 0,nullptr,0 },
690 { "V_EMPTY",        SbxINTEGER,       CPROP_,    RTLNAME(V_EMPTY),0         },
691 { "V_NULL",         SbxINTEGER,       CPROP_,    RTLNAME(V_NULL),0          },
692 { "V_INTEGER",      SbxINTEGER,       CPROP_,    RTLNAME(V_INTEGER),0       },
693 { "V_LONG",         SbxINTEGER,       CPROP_,    RTLNAME(V_LONG),0          },
694 { "V_SINGLE",       SbxINTEGER,       CPROP_,    RTLNAME(V_SINGLE),0        },
695 { "V_DOUBLE",       SbxINTEGER,       CPROP_,    RTLNAME(V_DOUBLE),0        },
696 { "V_CURRENCY",     SbxINTEGER,       CPROP_,    RTLNAME(V_CURRENCY),0      },
697 { "V_DATE",         SbxINTEGER,       CPROP_,    RTLNAME(V_DATE),0          },
698 { "V_STRING",       SbxINTEGER,       CPROP_,    RTLNAME(V_STRING),0        },
699 
700 { "Wait",           SbxNULL,      1 | FUNCTION_, RTLNAME(Wait),0            },
701   { "Milliseconds", SbxLONG, 0,nullptr,0 },
702 { "FuncCaller",          SbxVARIANT,      FUNCTION_, RTLNAME(FuncCaller),0      },
703 //#i64882#
704 { "WaitUntil",          SbxNULL,      1 | FUNCTION_, RTLNAME(WaitUntil),0      },
705   { "Date", SbxDOUBLE, 0,nullptr,0 },
706 { "Weekday",        SbxINTEGER,   2 | FUNCTION_, RTLNAME(Weekday),0         },
707   { "Date",         SbxDATE, 0,nullptr,0 },
708   { "Firstdayofweek", SbxINTEGER, OPT_, nullptr,0 },
709 { "WeekdayName",    SbxSTRING,    3 | FUNCTION_ | COMPATONLY_, RTLNAME(WeekdayName),0 },
710   { "Weekday",      SbxINTEGER, 0,nullptr,0 },
711   { "Abbreviate",   SbxBOOL,      OPT_, nullptr,0 },
712   { "Firstdayofweek", SbxINTEGER, OPT_, nullptr,0 },
713 { "Year",           SbxINTEGER,   1 | FUNCTION_, RTLNAME(Year),0            },
714   { "Date",         SbxDATE, 0,nullptr,0 },
715 
716 { nullptr,             SbxNULL,     -1,nullptr,0 }};  // end of the table
717 
718 SbiStdObject::SbiStdObject( const OUString& r, StarBASIC* pb ) : SbxObject( r )
719 {
720     // do we have to initialize the hashcodes?
721     Methods* p = aMethods;
722     if( !p->nHash )
723         while( p->nArgs != -1 )
724         {
725             OUString aName_ = OUString::createFromAscii( p->pName );
726             p->nHash = SbxVariable::MakeHashCode( aName_ );
727             p += ( p->nArgs & ARGSMASK_ ) + 1;
728         }
729 
730     // #i92642: Remove default properties
731     Remove( "Name", SbxClassType::DontCare );
732     Remove( "Parent", SbxClassType::DontCare );
733 
734     SetParent( pb );
735 
736     pStdFactory.reset( new SbStdFactory );
737     SbxBase::AddFactory( pStdFactory.get() );
738 
739     Insert( new SbStdClipboard );
740 }
741 
742 SbiStdObject::~SbiStdObject()
743 {
744     SbxBase::RemoveFactory( pStdFactory.get() );
745     pStdFactory.reset();
746 }
747 
748 // Finding an element:
749 // It runs linearly through the method table here until an
750 // adequate method is has been found. Because of the bits in
751 // the nArgs-field the adequate instance of an SbxObjElement
752 // is created then. If the method/property hasn't been found,
753 // return NULL without error code, so that a whole chain of
754 // objects can be asked for the method/property.
755 
756 SbxVariable* SbiStdObject::Find( const OUString& rName, SbxClassType t )
757 {
758     // entered already?
759     SbxVariable* pVar = SbxObject::Find( rName, t );
760     if( !pVar )
761     {
762         // else search one
763         sal_uInt16 nHash_ = SbxVariable::MakeHashCode( rName );
764         Methods* p = aMethods;
765         bool bFound = false;
766         short nIndex = 0;
767         sal_uInt16 nSrchMask = TYPEMASK_;
768         switch( t )
769         {
770             case SbxClassType::Method:   nSrchMask = METHOD_; break;
771             case SbxClassType::Property: nSrchMask = PROPERTY_; break;
772             case SbxClassType::Object:   nSrchMask = OBJECT_; break;
773             default: break;
774         }
775         while( p->nArgs != -1 )
776         {
777             if( ( p->nArgs & nSrchMask )
778              && ( p->nHash == nHash_ )
779              && ( rName.equalsIgnoreAsciiCaseAscii( p->pName ) ) )
780             {
781                 bFound = true;
782                 if( p->nArgs & COMPTMASK_ )
783                 {
784                     bool bCompatibility = false;
785                     SbiInstance* pInst = GetSbData()->pInst;
786                     if (pInst)
787                     {
788                         bCompatibility = pInst->IsCompatibility();
789                     }
790                     else
791                     {
792                         // No instance running => compiling a source on module level.
793                         const SbModule* pModule = GetSbData()->pCompMod;
794                         if (pModule)
795                             bCompatibility = pModule->IsVBACompat();
796                     }
797                     if ((bCompatibility && (NORMONLY_ & p->nArgs)) || (!bCompatibility && (COMPATONLY_ & p->nArgs)))
798                         bFound = false;
799                 }
800                 break;
801             }
802             nIndex += ( p->nArgs & ARGSMASK_ ) + 1;
803             p = aMethods + nIndex;
804         }
805 
806         if( bFound )
807         {
808             // isolate Args-fields:
809             SbxFlagBits nAccess = static_cast<SbxFlagBits>(( p->nArgs & RWMASK_ ) >> 8);
810             short nType   = ( p->nArgs & TYPEMASK_ );
811             if( p->nArgs & CONST_ )
812                 nAccess |= SbxFlagBits::Const;
813             OUString aName_ = OUString::createFromAscii( p->pName );
814             SbxClassType eCT = SbxClassType::Object;
815             if( nType & PROPERTY_ )
816             {
817                 eCT = SbxClassType::Property;
818             }
819             else if( nType & METHOD_ )
820             {
821                 eCT = SbxClassType::Method;
822             }
823             pVar = Make( aName_, eCT, p->eType, ( p->nArgs & FUNCTION_ ) == FUNCTION_ );
824             pVar->SetUserData( nIndex + 1 );
825             pVar->SetFlags( nAccess );
826         }
827     }
828     return pVar;
829 }
830 
831 // SetModified must be pinched off at the RTL
832 void SbiStdObject::SetModified( bool )
833 {
834 }
835 
836 
837 void SbiStdObject::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
838 
839 {
840     const SbxHint* pHint = dynamic_cast<const SbxHint*>(&rHint);
841     if( pHint )
842     {
843         SbxVariable* pVar = pHint->GetVar();
844         SbxArray* pPar_ = pVar->GetParameters();
845         const sal_uInt16 nCallId = static_cast<sal_uInt16>(pVar->GetUserData());
846         if( nCallId )
847         {
848             const SfxHintId t = pHint->GetId();
849             if( t == SfxHintId::BasicInfoWanted )
850                 pVar->SetInfo( GetInfo( static_cast<short>(pVar->GetUserData()) ) );
851             else
852             {
853                 bool bWrite = false;
854                 if( t == SfxHintId::BasicDataChanged )
855                     bWrite = true;
856                 if( t == SfxHintId::BasicDataWanted || bWrite )
857                 {
858                     RtlCall p = aMethods[ nCallId-1 ].pFunc;
859                     SbxArrayRef rPar( pPar_ );
860                     if( !pPar_ )
861                     {
862                         rPar = pPar_ = new SbxArray;
863                         pPar_->Put32( pVar, 0 );
864                     }
865                     p( static_cast<StarBASIC*>(GetParent()), *pPar_, bWrite );
866                     return;
867                 }
868             }
869         }
870         SbxObject::Notify( rBC, rHint );
871     }
872 }
873 
874 // building the info-structure for single elements
875 // if nIdx = 0, don't create anything (Std-Props!)
876 
877 SbxInfo* SbiStdObject::GetInfo( short nIdx )
878 {
879     if( !nIdx )
880         return nullptr;
881     Methods* p = &aMethods[ --nIdx ];
882     SbxInfo* pInfo_ = new SbxInfo;
883     short nPar = p->nArgs & ARGSMASK_;
884     for( short i = 0; i < nPar; i++ )
885     {
886         p++;
887         OUString aName_ = OUString::createFromAscii( p->pName );
888         SbxFlagBits nFlags_ = static_cast<SbxFlagBits>(( p->nArgs >> 8 ) & 0x03);
889         if( p->nArgs & OPT_ )
890         {
891             nFlags_ |= SbxFlagBits::Optional;
892         }
893         pInfo_->AddParam( aName_, p->eType, nFlags_ );
894     }
895     return pInfo_;
896 }
897 
898 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
899