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