vbscript: Implemented Sgn.
[wine/multimedia.git] / dlls / vbscript / global.c
blobfa0635306125a0175e611399922261f9466d1ab6
1 /*
2 * Copyright 2011 Jacek Caban for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 #include <assert.h>
20 #include <math.h>
22 #include "vbscript.h"
23 #include "vbscript_defs.h"
25 #include "mshtmhst.h"
26 #include "objsafe.h"
28 #include "wine/debug.h"
30 WINE_DEFAULT_DEBUG_CHANNEL(vbscript);
32 #define VB_E_CANNOT_CREATE_OBJ 0x800a01ad
33 #define VB_E_MK_PARSE_ERROR 0x800a01b0
35 /* Defined as extern in urlmon.idl, but not exported by uuid.lib */
36 const GUID GUID_CUSTOM_CONFIRMOBJECTSAFETY =
37 {0x10200490,0xfa38,0x11d0,{0xac,0x0e,0x00,0xa0,0xc9,0xf,0xff,0xc0}};
39 static const WCHAR emptyW[] = {0};
40 static const WCHAR vbscriptW[] = {'V','B','S','c','r','i','p','t',0};
42 static IInternetHostSecurityManager *get_sec_mgr(script_ctx_t *ctx)
44 IInternetHostSecurityManager *secmgr;
45 IServiceProvider *sp;
46 HRESULT hres;
48 if(!ctx->site)
49 return NULL;
51 if(ctx->secmgr)
52 return ctx->secmgr;
54 hres = IActiveScriptSite_QueryInterface(ctx->site, &IID_IServiceProvider, (void**)&sp);
55 if(FAILED(hres))
56 return NULL;
58 hres = IServiceProvider_QueryService(sp, &SID_SInternetHostSecurityManager, &IID_IInternetHostSecurityManager,
59 (void**)&secmgr);
60 IServiceProvider_Release(sp);
61 if(FAILED(hres))
62 return NULL;
64 return ctx->secmgr = secmgr;
67 static HRESULT return_string(VARIANT *res, const WCHAR *str)
69 BSTR ret;
71 if(!res)
72 return S_OK;
74 ret = SysAllocString(str);
75 if(!ret)
76 return E_OUTOFMEMORY;
78 V_VT(res) = VT_BSTR;
79 V_BSTR(res) = ret;
80 return S_OK;
83 static HRESULT return_bstr(VARIANT *res, BSTR str)
85 if(res) {
86 V_VT(res) = VT_BSTR;
87 V_BSTR(res) = str;
88 }else {
89 SysFreeString(str);
91 return S_OK;
94 static HRESULT return_short(VARIANT *res, short val)
96 if(res) {
97 V_VT(res) = VT_I2;
98 V_I2(res) = val;
101 return S_OK;
104 static HRESULT return_int(VARIANT *res, int val)
106 if((short)val == val)
107 return return_short(res, val);
109 if(res) {
110 V_VT(res) = VT_I4;
111 V_I4(res) = val;
114 return S_OK;
117 static inline HRESULT return_double(VARIANT *res, double val)
119 if(res) {
120 V_VT(res) = VT_R8;
121 V_R8(res) = val;
124 return S_OK;
127 static inline HRESULT return_null(VARIANT *res)
129 if(res)
130 V_VT(res) = VT_NULL;
131 return S_OK;
134 static inline HRESULT return_date(VARIANT *res, double date)
136 if(res) {
137 V_VT(res) = VT_DATE;
138 V_DATE(res) = date;
140 return S_OK;
143 HRESULT to_int(VARIANT *v, int *ret)
145 if(V_VT(v) == (VT_BYREF|VT_VARIANT))
146 v = V_VARIANTREF(v);
148 switch(V_VT(v)) {
149 case VT_I2:
150 *ret = V_I2(v);
151 break;
152 case VT_I4:
153 *ret = V_I4(v);
154 break;
155 case VT_R8: {
156 double n = floor(V_R8(v)+0.5);
157 INT32 i;
159 if(!is_int32(n)) {
160 FIXME("%lf is out of int range\n", n);
161 return E_FAIL;
164 /* Round half to even */
165 i = n;
166 if(i%2 && n-V_R8(v) == 0.5)
167 i--;
169 *ret = i;
170 break;
172 case VT_BOOL:
173 *ret = V_BOOL(v) ? -1 : 0;
174 break;
175 default:
176 FIXME("not supported %s\n", debugstr_variant(v));
177 return E_NOTIMPL;
180 return S_OK;
183 static HRESULT to_double(VARIANT *v, double *ret)
185 VARIANT dst;
186 HRESULT hres;
188 V_VT(&dst) = VT_EMPTY;
189 hres = VariantChangeType(&dst, v, 0, VT_R8);
190 if(FAILED(hres))
191 return hres;
193 *ret = V_R8(&dst);
194 return S_OK;
197 static HRESULT to_string(VARIANT *v, BSTR *ret)
199 VARIANT dst;
200 HRESULT hres;
202 V_VT(&dst) = VT_EMPTY;
203 hres = VariantChangeType(&dst, v, VARIANT_LOCALBOOL, VT_BSTR);
204 if(FAILED(hres))
205 return hres;
207 *ret = V_BSTR(&dst);
208 return S_OK;
211 static HRESULT set_object_site(script_ctx_t *ctx, IUnknown *obj)
213 IObjectWithSite *obj_site;
214 IUnknown *ax_site;
215 HRESULT hres;
217 hres = IUnknown_QueryInterface(obj, &IID_IObjectWithSite, (void**)&obj_site);
218 if(FAILED(hres))
219 return S_OK;
221 ax_site = create_ax_site(ctx);
222 if(ax_site)
223 hres = IObjectWithSite_SetSite(obj_site, ax_site);
224 else
225 hres = E_OUTOFMEMORY;
226 IUnknown_Release(ax_site);
227 IObjectWithSite_Release(obj_site);
228 return hres;
231 static IUnknown *create_object(script_ctx_t *ctx, const WCHAR *progid)
233 IInternetHostSecurityManager *secmgr = NULL;
234 struct CONFIRMSAFETY cs;
235 IClassFactoryEx *cfex;
236 IClassFactory *cf;
237 DWORD policy_size;
238 BYTE *bpolicy;
239 IUnknown *obj;
240 DWORD policy;
241 GUID guid;
242 HRESULT hres;
244 hres = CLSIDFromProgID(progid, &guid);
245 if(FAILED(hres))
246 return NULL;
248 TRACE("GUID %s\n", debugstr_guid(&guid));
250 if(ctx->safeopt & INTERFACE_USES_SECURITY_MANAGER) {
251 secmgr = get_sec_mgr(ctx);
252 if(!secmgr)
253 return NULL;
255 policy = 0;
256 hres = IInternetHostSecurityManager_ProcessUrlAction(secmgr, URLACTION_ACTIVEX_RUN,
257 (BYTE*)&policy, sizeof(policy), (BYTE*)&guid, sizeof(GUID), 0, 0);
258 if(FAILED(hres) || policy != URLPOLICY_ALLOW)
259 return NULL;
262 hres = CoGetClassObject(&guid, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, NULL, &IID_IClassFactory, (void**)&cf);
263 if(FAILED(hres))
264 return NULL;
266 hres = IClassFactory_QueryInterface(cf, &IID_IClassFactoryEx, (void**)&cfex);
267 if(SUCCEEDED(hres)) {
268 FIXME("Use IClassFactoryEx\n");
269 IClassFactoryEx_Release(cfex);
272 hres = IClassFactory_CreateInstance(cf, NULL, &IID_IUnknown, (void**)&obj);
273 if(FAILED(hres))
274 return NULL;
276 if(secmgr) {
277 cs.clsid = guid;
278 cs.pUnk = obj;
279 cs.dwFlags = 0;
280 hres = IInternetHostSecurityManager_QueryCustomPolicy(secmgr, &GUID_CUSTOM_CONFIRMOBJECTSAFETY,
281 &bpolicy, &policy_size, (BYTE*)&cs, sizeof(cs), 0);
282 if(SUCCEEDED(hres)) {
283 policy = policy_size >= sizeof(DWORD) ? *(DWORD*)bpolicy : URLPOLICY_DISALLOW;
284 CoTaskMemFree(bpolicy);
287 if(FAILED(hres) || policy != URLPOLICY_ALLOW) {
288 IUnknown_Release(obj);
289 return NULL;
293 hres = set_object_site(ctx, obj);
294 if(FAILED(hres)) {
295 IUnknown_Release(obj);
296 return NULL;
299 return obj;
302 static HRESULT show_msgbox(script_ctx_t *ctx, BSTR prompt, VARIANT *res)
304 SCRIPTUICHANDLING uic_handling = SCRIPTUICHANDLING_ALLOW;
305 IActiveScriptSiteUIControl *ui_control;
306 IActiveScriptSiteWindow *acts_window;
307 const WCHAR *title;
308 HWND hwnd = NULL;
309 int ret;
310 HRESULT hres;
312 hres = IActiveScriptSite_QueryInterface(ctx->site, &IID_IActiveScriptSiteUIControl, (void**)&ui_control);
313 if(SUCCEEDED(hres)) {
314 hres = IActiveScriptSiteUIControl_GetUIBehavior(ui_control, SCRIPTUICITEM_MSGBOX, &uic_handling);
315 IActiveScriptSiteUIControl_Release(ui_control);
316 if(FAILED(hres))
317 uic_handling = SCRIPTUICHANDLING_ALLOW;
320 switch(uic_handling) {
321 case SCRIPTUICHANDLING_ALLOW:
322 break;
323 case SCRIPTUICHANDLING_NOUIDEFAULT:
324 return return_short(res, 0);
325 default:
326 FIXME("blocked\n");
327 return E_FAIL;
330 title = (ctx->safeopt & INTERFACE_USES_SECURITY_MANAGER) ? vbscriptW : emptyW;
332 hres = IActiveScriptSite_QueryInterface(ctx->site, &IID_IActiveScriptSiteWindow, (void**)&acts_window);
333 if(FAILED(hres)) {
334 FIXME("No IActiveScriptSiteWindow\n");
335 return hres;
338 hres = IActiveScriptSiteWindow_GetWindow(acts_window, &hwnd);
339 if(SUCCEEDED(hres)) {
340 hres = IActiveScriptSiteWindow_EnableModeless(acts_window, FALSE);
341 if(SUCCEEDED(hres)) {
342 ret = MessageBoxW(hwnd, prompt, title, MB_OK);
343 hres = IActiveScriptSiteWindow_EnableModeless(acts_window, TRUE);
347 IActiveScriptSiteWindow_Release(acts_window);
348 if(FAILED(hres)) {
349 FIXME("failed: %08x\n", hres);
350 return hres;
353 return return_short(res, ret);
356 static HRESULT Global_CCur(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
358 VARIANT v;
359 HRESULT hres;
361 TRACE("%s\n", debugstr_variant(arg));
363 assert(args_cnt == 1);
365 V_VT(&v) = VT_EMPTY;
366 hres = VariantChangeType(&v, arg, 0, VT_CY);
367 if(FAILED(hres))
368 return hres;
370 if(!res) {
371 VariantClear(&v);
372 return DISP_E_BADVARTYPE;
375 *res = v;
376 return S_OK;
379 static HRESULT Global_CInt(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
381 VARIANT v;
382 HRESULT hres;
384 TRACE("%s\n", debugstr_variant(arg));
386 assert(args_cnt == 1);
388 V_VT(&v) = VT_EMPTY;
389 hres = VariantChangeType(&v, arg, 0, VT_I2);
390 if(FAILED(hres))
391 return hres;
393 if(!res)
394 return DISP_E_BADVARTYPE;
395 else {
396 *res = v;
397 return S_OK;
401 static HRESULT Global_CLng(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
403 VARIANT v;
404 HRESULT hres;
406 TRACE("%s\n", debugstr_variant(arg));
408 assert(args_cnt == 1);
410 V_VT(&v) = VT_EMPTY;
411 hres = VariantChangeType(&v, arg, 0, VT_I4);
412 if(FAILED(hres))
413 return hres;
415 if(!res)
416 return DISP_E_BADVARTYPE;
417 else {
418 *res = v;
419 return S_OK;
423 static HRESULT Global_CBool(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
425 VARIANT v;
426 HRESULT hres;
428 TRACE("%s\n", debugstr_variant(arg));
430 assert(args_cnt == 1);
432 V_VT(&v) = VT_EMPTY;
433 hres = VariantChangeType(&v, arg, VARIANT_LOCALBOOL, VT_BOOL);
434 if(FAILED(hres))
435 return hres;
437 if(res)
438 *res = v;
439 else
440 VariantClear(&v);
441 return S_OK;
444 static HRESULT Global_CByte(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
446 VARIANT v;
447 HRESULT hres;
449 TRACE("%s\n", debugstr_variant(arg));
451 assert(args_cnt == 1);
453 V_VT(&v) = VT_EMPTY;
454 hres = VariantChangeType(&v, arg, VARIANT_LOCALBOOL, VT_UI1);
455 if(FAILED(hres))
456 return hres;
458 if(!res) {
459 VariantClear(&v);
460 return DISP_E_BADVARTYPE;
463 *res = v;
464 return S_OK;
467 static HRESULT Global_CDate(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
469 FIXME("\n");
470 return E_NOTIMPL;
473 static HRESULT Global_CDbl(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
475 VARIANT v;
476 HRESULT hres;
478 TRACE("%s\n", debugstr_variant(arg));
480 assert(args_cnt == 1);
482 V_VT(&v) = VT_EMPTY;
483 hres = VariantChangeType(&v, arg, 0, VT_R8);
484 if(FAILED(hres))
485 return hres;
487 if(!res)
488 return DISP_E_BADVARTYPE;
489 else {
490 *res = v;
491 return S_OK;
495 static HRESULT Global_CSng(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
497 VARIANT v;
498 HRESULT hres;
500 TRACE("%s\n", debugstr_variant(arg));
502 assert(args_cnt == 1);
504 V_VT(&v) = VT_EMPTY;
505 hres = VariantChangeType(&v, arg, 0, VT_R4);
506 if(FAILED(hres))
507 return hres;
509 if(!res)
510 return DISP_E_BADVARTYPE;
512 *res = v;
513 return S_OK;
516 static HRESULT Global_CStr(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
518 BSTR str;
519 HRESULT hres;
521 TRACE("%s\n", debugstr_variant(arg));
523 hres = to_string(arg, &str);
524 if(FAILED(hres))
525 return hres;
527 return return_bstr(res, str);
530 static inline WCHAR hex_char(unsigned n)
532 return n < 10 ? '0'+n : 'A'+n-10;
535 static HRESULT Global_Hex(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
537 WCHAR buf[17], *ptr;
538 DWORD n;
540 TRACE("%s\n", debugstr_variant(arg));
542 switch(V_VT(arg)) {
543 case VT_I2:
544 n = (WORD)V_I2(arg);
545 break;
546 case VT_I4:
547 n = V_I4(arg);
548 break;
549 case VT_EMPTY:
550 n = 0;
551 break;
552 case VT_NULL:
553 if(res)
554 V_VT(res) = VT_NULL;
555 return S_OK;
556 default:
557 FIXME("unsupported type %s\n", debugstr_variant(arg));
558 return E_NOTIMPL;
561 buf[16] = 0;
562 ptr = buf+15;
564 if(n) {
565 do {
566 *ptr-- = hex_char(n & 0xf);
567 n >>= 4;
568 }while(n);
569 ptr++;
570 }else {
571 *ptr = '0';
574 return return_string(res, ptr);
577 static HRESULT Global_Oct(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
579 FIXME("\n");
580 return E_NOTIMPL;
583 static HRESULT Global_VarType(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
585 TRACE("(%s)\n", debugstr_variant(arg));
587 assert(args_cnt == 1);
589 if(V_VT(arg) & ~VT_TYPEMASK) {
590 FIXME("not supported %s\n", debugstr_variant(arg));
591 return E_NOTIMPL;
594 return return_short(res, V_VT(arg));
597 static HRESULT Global_IsDate(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
599 FIXME("\n");
600 return E_NOTIMPL;
603 static HRESULT Global_IsEmpty(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
605 TRACE("(%s)\n", debugstr_variant(arg));
607 assert(args_cnt == 1);
609 if(res) {
610 V_VT(res) = VT_BOOL;
611 V_BOOL(res) = V_VT(arg) == VT_EMPTY ? VARIANT_TRUE : VARIANT_FALSE;
613 return S_OK;
616 static HRESULT Global_IsNull(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
618 TRACE("(%s)\n", debugstr_variant(arg));
620 assert(args_cnt == 1);
622 if(res) {
623 V_VT(res) = VT_BOOL;
624 V_BOOL(res) = V_VT(arg) == VT_NULL ? VARIANT_TRUE : VARIANT_FALSE;
626 return S_OK;
629 static HRESULT Global_IsNumeric(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
631 FIXME("\n");
632 return E_NOTIMPL;
635 static HRESULT Global_IsArray(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
637 FIXME("\n");
638 return E_NOTIMPL;
641 static HRESULT Global_IsObject(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
643 TRACE("(%s)\n", debugstr_variant(arg));
645 assert(args_cnt == 1);
647 if(res) {
648 V_VT(res) = VT_BOOL;
649 V_BOOL(res) = V_VT(arg) == VT_DISPATCH ? VARIANT_TRUE : VARIANT_FALSE;
651 return S_OK;
654 static HRESULT Global_Ant(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
656 FIXME("\n");
657 return E_NOTIMPL;
660 static HRESULT Global_Cos(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
662 FIXME("\n");
663 return E_NOTIMPL;
666 static HRESULT Global_Sin(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
668 FIXME("\n");
669 return E_NOTIMPL;
672 static HRESULT Global_Tan(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
674 FIXME("\n");
675 return E_NOTIMPL;
678 static HRESULT Global_Exp(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
680 FIXME("\n");
681 return E_NOTIMPL;
684 static HRESULT Global_Log(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
686 FIXME("\n");
687 return E_NOTIMPL;
690 static HRESULT Global_Sqr(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
692 FIXME("\n");
693 return E_NOTIMPL;
696 static HRESULT Global_Randomize(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
698 FIXME("\n");
699 return E_NOTIMPL;
702 static HRESULT Global_Rnd(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
704 FIXME("\n");
705 return E_NOTIMPL;
708 static HRESULT Global_Timer(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
710 FIXME("\n");
711 return E_NOTIMPL;
714 static HRESULT Global_LBound(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
716 FIXME("\n");
717 return E_NOTIMPL;
720 static HRESULT Global_UBound(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
722 FIXME("\n");
723 return E_NOTIMPL;
726 static HRESULT Global_RGB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
728 FIXME("\n");
729 return E_NOTIMPL;
732 static HRESULT Global_Len(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
734 DWORD len;
735 HRESULT hres;
737 TRACE("%s\n", debugstr_variant(arg));
739 if(V_VT(arg) == VT_NULL)
740 return return_null(res);
742 if(V_VT(arg) != VT_BSTR) {
743 BSTR str;
745 hres = to_string(arg, &str);
746 if(FAILED(hres))
747 return hres;
749 len = SysStringLen(str);
750 SysFreeString(str);
751 }else {
752 len = SysStringLen(V_BSTR(arg));
755 return return_int(res, len);
758 static HRESULT Global_LenB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
760 FIXME("\n");
761 return E_NOTIMPL;
764 static HRESULT Global_Left(vbdisp_t *This, VARIANT *args, unsigned args_cnt, VARIANT *res)
766 BSTR str, ret, conv_str = NULL;
767 int len, str_len;
768 HRESULT hres;
770 TRACE("(%s %s)\n", debugstr_variant(args+1), debugstr_variant(args));
772 if(V_VT(args) == VT_BSTR) {
773 str = V_BSTR(args);
774 }else {
775 hres = to_string(args, &conv_str);
776 if(FAILED(hres))
777 return hres;
778 str = conv_str;
781 hres = to_int(args+1, &len);
782 if(FAILED(hres))
783 return hres;
785 if(len < 0) {
786 FIXME("len = %d\n", len);
787 return E_FAIL;
790 str_len = SysStringLen(str);
791 if(len > str_len)
792 len = str_len;
794 ret = SysAllocStringLen(str, len);
795 SysFreeString(conv_str);
796 if(!ret)
797 return E_OUTOFMEMORY;
799 return return_bstr(res, ret);
802 static HRESULT Global_LeftB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
804 FIXME("\n");
805 return E_NOTIMPL;
808 static HRESULT Global_Right(vbdisp_t *This, VARIANT *args, unsigned args_cnt, VARIANT *res)
810 BSTR str, ret, conv_str = NULL;
811 int len, str_len;
812 HRESULT hres;
814 TRACE("(%s %s)\n", debugstr_variant(args), debugstr_variant(args+1));
816 if(V_VT(args+1) == VT_BSTR) {
817 str = V_BSTR(args);
818 }else {
819 hres = to_string(args, &conv_str);
820 if(FAILED(hres))
821 return hres;
822 str = conv_str;
825 hres = to_int(args+1, &len);
826 if(FAILED(hres))
827 return hres;
829 if(len < 0) {
830 FIXME("len = %d\n", len);
831 return E_FAIL;
834 str_len = SysStringLen(str);
835 if(len > str_len)
836 len = str_len;
838 ret = SysAllocStringLen(str+str_len-len, len);
839 SysFreeString(conv_str);
840 if(!ret)
841 return E_OUTOFMEMORY;
843 return return_bstr(res, ret);
846 static HRESULT Global_RightB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
848 FIXME("\n");
849 return E_NOTIMPL;
852 static HRESULT Global_Mid(vbdisp_t *This, VARIANT *args, unsigned args_cnt, VARIANT *res)
854 int len = -1, start, str_len;
855 BSTR str;
856 HRESULT hres;
858 TRACE("(%s %s ...)\n", debugstr_variant(args), debugstr_variant(args+1));
860 assert(args_cnt == 2 || args_cnt == 3);
862 if(V_VT(args) != VT_BSTR) {
863 FIXME("args[0] = %s\n", debugstr_variant(args));
864 return E_NOTIMPL;
867 str = V_BSTR(args);
869 hres = to_int(args+1, &start);
870 if(FAILED(hres))
871 return hres;
873 if(args_cnt == 3) {
874 hres = to_int(args+2, &len);
875 if(FAILED(hres))
876 return hres;
878 if(len < 0) {
879 FIXME("len = %d\n", len);
880 return E_FAIL;
885 str_len = SysStringLen(str);
886 start--;
887 if(start > str_len)
888 start = str_len;
890 if(len == -1)
891 len = str_len-start;
892 else if(len > str_len-start)
893 len = str_len-start;
895 if(res) {
896 V_VT(res) = VT_BSTR;
897 V_BSTR(res) = SysAllocStringLen(str+start, len);
898 if(!V_BSTR(res))
899 return E_OUTOFMEMORY;
902 return S_OK;
905 static HRESULT Global_MidB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
907 FIXME("\n");
908 return E_NOTIMPL;
911 static HRESULT Global_StrComp(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
913 FIXME("\n");
914 return E_NOTIMPL;
917 static HRESULT Global_LCase(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
919 BSTR str;
920 HRESULT hres;
922 TRACE("%s\n", debugstr_variant(arg));
924 if(V_VT(arg) == VT_NULL) {
925 if(res)
926 V_VT(res) = VT_NULL;
927 return S_OK;
930 hres = to_string(arg, &str);
931 if(FAILED(hres))
932 return hres;
934 if(res) {
935 WCHAR *ptr;
937 for(ptr = str; *ptr; ptr++)
938 *ptr = tolowerW(*ptr);
940 V_VT(res) = VT_BSTR;
941 V_BSTR(res) = str;
942 }else {
943 SysFreeString(str);
945 return S_OK;
948 static HRESULT Global_UCase(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
950 BSTR str;
951 HRESULT hres;
953 TRACE("%s\n", debugstr_variant(arg));
955 if(V_VT(arg) == VT_NULL) {
956 if(res)
957 V_VT(res) = VT_NULL;
958 return S_OK;
961 hres = to_string(arg, &str);
962 if(FAILED(hres))
963 return hres;
965 if(res) {
966 WCHAR *ptr;
968 for(ptr = str; *ptr; ptr++)
969 *ptr = toupperW(*ptr);
971 V_VT(res) = VT_BSTR;
972 V_BSTR(res) = str;
973 }else {
974 SysFreeString(str);
976 return S_OK;
979 static HRESULT Global_LTrim(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
981 BSTR str, conv_str = NULL;
982 WCHAR *ptr;
983 HRESULT hres;
985 TRACE("%s\n", debugstr_variant(arg));
987 if(V_VT(arg) == VT_BSTR) {
988 str = V_BSTR(arg);
989 }else {
990 hres = to_string(arg, &conv_str);
991 if(FAILED(hres))
992 return hres;
993 str = conv_str;
996 for(ptr = str; *ptr && isspaceW(*ptr); ptr++);
998 str = SysAllocString(ptr);
999 SysFreeString(conv_str);
1000 if(!str)
1001 return E_OUTOFMEMORY;
1003 return return_bstr(res, str);
1006 static HRESULT Global_RTrim(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1008 BSTR str, conv_str = NULL;
1009 WCHAR *ptr;
1010 HRESULT hres;
1012 TRACE("%s\n", debugstr_variant(arg));
1014 if(V_VT(arg) == VT_BSTR) {
1015 str = V_BSTR(arg);
1016 }else {
1017 hres = to_string(arg, &conv_str);
1018 if(FAILED(hres))
1019 return hres;
1020 str = conv_str;
1023 for(ptr = str+SysStringLen(str); ptr-1 > str && isspaceW(*(ptr-1)); ptr--);
1025 str = SysAllocStringLen(str, ptr-str);
1026 SysFreeString(conv_str);
1027 if(!str)
1028 return E_OUTOFMEMORY;
1030 return return_bstr(res, str);
1033 static HRESULT Global_Trim(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1035 BSTR str, conv_str = NULL;
1036 WCHAR *begin_ptr, *end_ptr;
1037 HRESULT hres;
1039 TRACE("%s\n", debugstr_variant(arg));
1041 if(V_VT(arg) == VT_BSTR) {
1042 str = V_BSTR(arg);
1043 }else {
1044 hres = to_string(arg, &conv_str);
1045 if(FAILED(hres))
1046 return hres;
1047 str = conv_str;
1050 for(begin_ptr = str; *begin_ptr && isspaceW(*begin_ptr); begin_ptr++);
1051 for(end_ptr = str+SysStringLen(str); end_ptr-1 > begin_ptr && isspaceW(*(end_ptr-1)); end_ptr--);
1053 str = SysAllocStringLen(begin_ptr, end_ptr-begin_ptr);
1054 SysFreeString(conv_str);
1055 if(!str)
1056 return E_OUTOFMEMORY;
1058 return return_bstr(res, str);
1061 static HRESULT Global_Space(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1063 BSTR str;
1064 int n, i;
1065 HRESULT hres;
1067 TRACE("%s\n", debugstr_variant(arg));
1069 hres = to_int(arg, &n);
1070 if(FAILED(hres))
1071 return hres;
1073 if(n < 0) {
1074 FIXME("n = %d\n", n);
1075 return E_NOTIMPL;
1078 if(!res)
1079 return S_OK;
1081 str = SysAllocStringLen(NULL, n);
1082 if(!str)
1083 return E_OUTOFMEMORY;
1085 for(i=0; i<n; i++)
1086 str[i] = ' ';
1088 V_VT(res) = VT_BSTR;
1089 V_BSTR(res) = str;
1090 return S_OK;
1093 static HRESULT Global_String(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1095 FIXME("\n");
1096 return E_NOTIMPL;
1099 static HRESULT Global_InStr(vbdisp_t *This, VARIANT *args, unsigned args_cnt, VARIANT *res)
1101 VARIANT *startv, *str1v, *str2v;
1102 BSTR str1, str2;
1103 int start, ret;
1104 HRESULT hres;
1106 TRACE("\n");
1108 assert(2 <= args_cnt && args_cnt <= 4);
1110 switch(args_cnt) {
1111 case 2:
1112 startv = NULL;
1113 str1v = args;
1114 str2v = args+1;
1115 break;
1116 case 3:
1117 startv = args;
1118 str1v = args+1;
1119 str2v = args+2;
1120 break;
1121 case 4:
1122 FIXME("unsupported compare argument %s\n", debugstr_variant(args));
1123 return E_NOTIMPL;
1124 DEFAULT_UNREACHABLE;
1127 if(startv) {
1128 hres = to_int(startv, &start);
1129 if(FAILED(hres))
1130 return hres;
1131 if(--start < 0) {
1132 FIXME("start %d\n", start);
1133 return E_FAIL;
1135 }else {
1136 start = 0;
1139 if(V_VT(str1v) == VT_NULL || V_VT(str2v) == VT_NULL)
1140 return return_null(res);
1142 if(V_VT(str1v) != VT_BSTR) {
1143 FIXME("Unsupported str1 type %s\n", debugstr_variant(str1v));
1144 return E_NOTIMPL;
1146 str1 = V_BSTR(str1v);
1148 if(V_VT(str2v) != VT_BSTR) {
1149 FIXME("Unsupported str2 type %s\n", debugstr_variant(str2v));
1150 return E_NOTIMPL;
1152 str2 = V_BSTR(str2v);
1154 if(start < SysStringLen(str1)) {
1155 WCHAR *ptr;
1157 ptr = strstrW(str1+start, str2);
1158 ret = ptr ? ptr-str1+1 : 0;
1159 }else {
1160 ret = 0;
1163 return return_int(res, ret);
1166 static HRESULT Global_InStrB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1168 FIXME("\n");
1169 return E_NOTIMPL;
1172 static HRESULT Global_AscB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1174 FIXME("\n");
1175 return E_NOTIMPL;
1178 static HRESULT Global_ChrB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1180 FIXME("\n");
1181 return E_NOTIMPL;
1184 static HRESULT Global_Asc(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1186 FIXME("\n");
1187 return E_NOTIMPL;
1190 /* The function supports only single-byte and double-byte character sets. It
1191 * ignores language specified by IActiveScriptSite::GetLCID. The argument needs
1192 * to be in range of short or unsigned short. */
1193 static HRESULT Global_Chr(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1195 int cp, c, len = 0;
1196 CPINFO cpi;
1197 WCHAR ch;
1198 char buf[2];
1199 HRESULT hres;
1201 TRACE("%s\n", debugstr_variant(arg));
1203 hres = to_int(arg, &c);
1204 if(FAILED(hres))
1205 return hres;
1207 cp = GetACP();
1208 if(!GetCPInfo(cp, &cpi))
1209 cpi.MaxCharSize = 1;
1211 if((c!=(short)c && c!=(unsigned short)c) ||
1212 (unsigned short)c>=(cpi.MaxCharSize>1 ? 0x10000 : 0x100)) {
1213 WARN("invalid arg %d\n", c);
1214 return MAKE_VBSERROR(VBSE_ILLEGAL_FUNC_CALL);
1217 if(c>>8)
1218 buf[len++] = c>>8;
1219 if(!len || IsDBCSLeadByteEx(cp, buf[0]))
1220 buf[len++] = c;
1221 if(!MultiByteToWideChar(0, 0, buf, len, &ch, 1)) {
1222 WARN("invalid arg %d, cp %d\n", c, cp);
1223 return E_FAIL;
1226 if(res) {
1227 V_VT(res) = VT_BSTR;
1228 V_BSTR(res) = SysAllocStringLen(&ch, 1);
1229 if(!V_BSTR(res))
1230 return E_OUTOFMEMORY;
1232 return S_OK;
1235 static HRESULT Global_AscW(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1237 FIXME("\n");
1238 return E_NOTIMPL;
1241 static HRESULT Global_ChrW(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1243 FIXME("\n");
1244 return E_NOTIMPL;
1247 static HRESULT Global_Abs(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1249 FIXME("\n");
1250 return E_NOTIMPL;
1253 static HRESULT Global_Fix(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1255 FIXME("\n");
1256 return E_NOTIMPL;
1259 static HRESULT Global_Int(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1261 FIXME("\n");
1262 return E_NOTIMPL;
1265 static HRESULT Global_Sgn(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1267 double v;
1268 short val;
1269 HRESULT hres;
1271 TRACE("(%s)\n", debugstr_variant(arg));
1273 assert(args_cnt == 1);
1275 if(V_VT(arg) == VT_NULL)
1276 return MAKE_VBSERROR(VBSE_ILLEGAL_NULL_USE);
1278 hres = to_double(arg, &v);
1279 if (FAILED(hres))
1280 return hres;
1282 val = v == 0 ? 0 : (v > 0 ? 1 : -1);
1283 return return_short(res, val);
1286 static HRESULT Global_Now(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1288 SYSTEMTIME lt;
1289 double date;
1291 TRACE("\n");
1293 GetLocalTime(&lt);
1294 SystemTimeToVariantTime(&lt, &date);
1295 return return_date(res, date);
1298 static HRESULT Global_Date(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1300 FIXME("\n");
1301 return E_NOTIMPL;
1304 static HRESULT Global_Time(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1306 FIXME("\n");
1307 return E_NOTIMPL;
1310 static HRESULT Global_Day(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1312 FIXME("\n");
1313 return E_NOTIMPL;
1316 static HRESULT Global_Month(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1318 FIXME("\n");
1319 return E_NOTIMPL;
1322 static HRESULT Global_Weekday(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1324 FIXME("\n");
1325 return E_NOTIMPL;
1328 static HRESULT Global_Year(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1330 FIXME("\n");
1331 return E_NOTIMPL;
1334 static HRESULT Global_Hour(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1336 FIXME("\n");
1337 return E_NOTIMPL;
1340 static HRESULT Global_Minute(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1342 FIXME("\n");
1343 return E_NOTIMPL;
1346 static HRESULT Global_Second(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1348 FIXME("\n");
1349 return E_NOTIMPL;
1352 static HRESULT Global_DateValue(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1354 FIXME("\n");
1355 return E_NOTIMPL;
1358 static HRESULT Global_TimeValue(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1360 FIXME("\n");
1361 return E_NOTIMPL;
1364 static HRESULT Global_DateSerial(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1366 FIXME("\n");
1367 return E_NOTIMPL;
1370 static HRESULT Global_TimeSerial(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1372 FIXME("\n");
1373 return E_NOTIMPL;
1376 static HRESULT Global_InputBox(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1378 FIXME("\n");
1379 return E_NOTIMPL;
1382 static HRESULT Global_MsgBox(vbdisp_t *This, VARIANT *args, unsigned args_cnt, VARIANT *res)
1384 BSTR prompt;
1385 HRESULT hres;
1387 TRACE("\n");
1389 if(args_cnt != 1) {
1390 FIXME("unsupported arg_cnt %d\n", args_cnt);
1391 return E_NOTIMPL;
1394 hres = to_string(args, &prompt);
1395 if(FAILED(hres))
1396 return hres;
1398 hres = show_msgbox(This->desc->ctx, prompt, res);
1399 SysFreeString(prompt);
1400 return hres;
1403 static HRESULT Global_CreateObject(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1405 IUnknown *obj;
1406 HRESULT hres;
1408 TRACE("(%s)\n", debugstr_variant(arg));
1410 if(V_VT(arg) != VT_BSTR) {
1411 FIXME("non-bstr arg\n");
1412 return E_INVALIDARG;
1415 obj = create_object(This->desc->ctx, V_BSTR(arg));
1416 if(!obj)
1417 return VB_E_CANNOT_CREATE_OBJ;
1419 if(res) {
1420 hres = IUnknown_QueryInterface(obj, &IID_IDispatch, (void**)&V_DISPATCH(res));
1421 if(FAILED(hres))
1422 return hres;
1424 V_VT(res) = VT_DISPATCH;
1427 IUnknown_Release(obj);
1428 return S_OK;
1431 static HRESULT Global_GetObject(vbdisp_t *This, VARIANT *args, unsigned args_cnt, VARIANT *res)
1433 IBindCtx *bind_ctx;
1434 IUnknown *obj_unk;
1435 IDispatch *disp;
1436 ULONG eaten = 0;
1437 IMoniker *mon;
1438 HRESULT hres;
1440 TRACE("%s %s\n", args_cnt ? debugstr_variant(args) : "", args_cnt > 1 ? debugstr_variant(args+1) : "");
1442 if(args_cnt != 1 || V_VT(args) != VT_BSTR) {
1443 FIXME("unsupported args\n");
1444 return E_NOTIMPL;
1447 if(This->desc->ctx->safeopt & (INTERFACE_USES_SECURITY_MANAGER|INTERFACESAFE_FOR_UNTRUSTED_DATA)) {
1448 WARN("blocked in current safety mode\n");
1449 return VB_E_CANNOT_CREATE_OBJ;
1452 hres = CreateBindCtx(0, &bind_ctx);
1453 if(FAILED(hres))
1454 return hres;
1456 hres = MkParseDisplayName(bind_ctx, V_BSTR(args), &eaten, &mon);
1457 if(SUCCEEDED(hres)) {
1458 hres = IMoniker_BindToObject(mon, bind_ctx, NULL, &IID_IUnknown, (void**)&obj_unk);
1459 IMoniker_Release(mon);
1460 }else {
1461 hres = MK_E_SYNTAX;
1463 IBindCtx_Release(bind_ctx);
1464 if(FAILED(hres))
1465 return hres;
1467 hres = set_object_site(This->desc->ctx, obj_unk);
1468 if(FAILED(hres)) {
1469 IUnknown_Release(obj_unk);
1470 return hres;
1473 hres = IUnknown_QueryInterface(obj_unk, &IID_IDispatch, (void**)&disp);
1474 if(SUCCEEDED(hres)) {
1475 if(res) {
1476 V_VT(res) = VT_DISPATCH;
1477 V_DISPATCH(res) = disp;
1478 }else {
1479 IDispatch_Release(disp);
1481 }else {
1482 FIXME("object does not support IDispatch\n");
1485 return hres;
1488 static HRESULT Global_DateAdd(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1490 FIXME("\n");
1491 return E_NOTIMPL;
1494 static HRESULT Global_DateDiff(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1496 FIXME("\n");
1497 return E_NOTIMPL;
1500 static HRESULT Global_DatePart(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1502 FIXME("\n");
1503 return E_NOTIMPL;
1506 static HRESULT Global_TypeName(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1508 static const WCHAR ByteW[] = {'B', 'y', 't', 'e', 0};
1509 static const WCHAR IntegerW[] = {'I', 'n', 't', 'e', 'g', 'e', 'r', 0};
1510 static const WCHAR LongW[] = {'L', 'o', 'n', 'g', 0};
1511 static const WCHAR SingleW[] = {'S', 'i', 'n', 'g', 'l', 'e', 0};
1512 static const WCHAR DoubleW[] = {'D', 'o', 'u', 'b', 'l', 'e', 0};
1513 static const WCHAR CurrencyW[] = {'C', 'u', 'r', 'r', 'e', 'n', 'c', 'y', 0};
1514 static const WCHAR DecimalW[] = {'D', 'e', 'c', 'i', 'm', 'a', 'l', 0};
1515 static const WCHAR DateW[] = {'D', 'a', 't', 'e', 0};
1516 static const WCHAR StringW[] = {'S', 't', 'r', 'i', 'n', 'g', 0};
1517 static const WCHAR BooleanW[] = {'B', 'o', 'o', 'l', 'e', 'a', 'n', 0};
1518 static const WCHAR EmptyW[] = {'E', 'm', 'p', 't', 'y', 0};
1519 static const WCHAR NullW[] = {'N', 'u', 'l', 'l', 0};
1521 TRACE("(%s)\n", debugstr_variant(arg));
1523 assert(args_cnt == 1);
1525 switch(V_VT(arg)) {
1526 case VT_UI1:
1527 return return_string(res, ByteW);
1528 case VT_I2:
1529 return return_string(res, IntegerW);
1530 case VT_I4:
1531 return return_string(res, LongW);
1532 case VT_R4:
1533 return return_string(res, SingleW);
1534 case VT_R8:
1535 return return_string(res, DoubleW);
1536 case VT_CY:
1537 return return_string(res, CurrencyW);
1538 case VT_DECIMAL:
1539 return return_string(res, DecimalW);
1540 case VT_DATE:
1541 return return_string(res, DateW);
1542 case VT_BSTR:
1543 return return_string(res, StringW);
1544 case VT_BOOL:
1545 return return_string(res, BooleanW);
1546 case VT_EMPTY:
1547 return return_string(res, EmptyW);
1548 case VT_NULL:
1549 return return_string(res, NullW);
1550 default:
1551 FIXME("arg %s not supported\n", debugstr_variant(arg));
1552 return E_NOTIMPL;
1556 static HRESULT Global_Array(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1558 FIXME("\n");
1559 return E_NOTIMPL;
1562 static HRESULT Global_Erase(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1564 FIXME("\n");
1565 return E_NOTIMPL;
1568 static HRESULT Global_Filter(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1570 FIXME("\n");
1571 return E_NOTIMPL;
1574 static HRESULT Global_Join(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1576 FIXME("\n");
1577 return E_NOTIMPL;
1580 static HRESULT Global_Split(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1582 FIXME("\n");
1583 return E_NOTIMPL;
1586 static HRESULT Global_Replace(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1588 FIXME("\n");
1589 return E_NOTIMPL;
1592 static HRESULT Global_StrReverse(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1594 WCHAR *ptr1, *ptr2, ch;
1595 BSTR ret;
1596 HRESULT hres;
1598 TRACE("%s\n", debugstr_variant(arg));
1600 hres = to_string(arg, &ret);
1601 if(FAILED(hres))
1602 return hres;
1604 ptr1 = ret;
1605 ptr2 = ret + SysStringLen(ret)-1;
1606 while(ptr1 < ptr2) {
1607 ch = *ptr1;
1608 *ptr1++ = *ptr2;
1609 *ptr2-- = ch;
1612 return return_bstr(res, ret);
1615 static HRESULT Global_InStrRev(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1617 FIXME("\n");
1618 return E_NOTIMPL;
1621 static HRESULT Global_LoadPicture(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1623 FIXME("\n");
1624 return E_NOTIMPL;
1627 static HRESULT Global_ScriptEngine(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1629 FIXME("\n");
1630 return E_NOTIMPL;
1633 static HRESULT Global_ScriptEngineMajorVersion(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1635 FIXME("\n");
1636 return E_NOTIMPL;
1639 static HRESULT Global_ScriptEngineMinorVersion(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1641 FIXME("\n");
1642 return E_NOTIMPL;
1645 static HRESULT Global_ScriptEngineBuildVersion(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1647 FIXME("\n");
1648 return E_NOTIMPL;
1651 static HRESULT Global_FormatNumber(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1653 FIXME("\n");
1654 return E_NOTIMPL;
1657 static HRESULT Global_FormatCurrency(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1659 FIXME("\n");
1660 return E_NOTIMPL;
1663 static HRESULT Global_FormatPercent(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1665 FIXME("\n");
1666 return E_NOTIMPL;
1669 static HRESULT Global_FormatDateTime(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1671 FIXME("\n");
1672 return E_NOTIMPL;
1675 static HRESULT Global_WeekdayName(vbdisp_t *This, VARIANT *args, unsigned args_cnt, VARIANT *res)
1677 int weekday, first_day = 1, abbrev = 0;
1678 BSTR ret;
1679 HRESULT hres;
1681 TRACE("\n");
1683 assert(1 <= args_cnt && args_cnt <= 3);
1685 hres = to_int(args, &weekday);
1686 if(FAILED(hres))
1687 return hres;
1689 if(args_cnt > 1) {
1690 hres = to_int(args+1, &abbrev);
1691 if(FAILED(hres))
1692 return hres;
1694 if(args_cnt == 3) {
1695 hres = to_int(args+2, &first_day);
1696 if(FAILED(hres))
1697 return hres;
1701 hres = VarWeekdayName(weekday, abbrev, first_day, 0, &ret);
1702 if(FAILED(hres))
1703 return hres;
1705 return return_bstr(res, ret);
1708 static HRESULT Global_MonthName(vbdisp_t *This, VARIANT *args, unsigned args_cnt, VARIANT *res)
1710 int month, abbrev = 0;
1711 BSTR ret;
1712 HRESULT hres;
1714 TRACE("\n");
1716 assert(args_cnt == 1 || args_cnt == 2);
1718 hres = to_int(args, &month);
1719 if(FAILED(hres))
1720 return hres;
1722 if(args_cnt == 2) {
1723 hres = to_int(args+1, &abbrev);
1724 if(FAILED(hres))
1725 return hres;
1728 hres = VarMonthName(month, abbrev, 0, &ret);
1729 if(FAILED(hres))
1730 return hres;
1732 return return_bstr(res, ret);
1735 static HRESULT Global_Round(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1737 double n;
1738 HRESULT hres;
1740 TRACE("%s\n", debugstr_variant(arg));
1742 if(!res)
1743 return S_OK;
1745 switch(V_VT(arg)) {
1746 case VT_I2:
1747 case VT_I4:
1748 case VT_BOOL:
1749 *res = *arg;
1750 return S_OK;
1751 case VT_R8:
1752 n = V_R8(arg);
1753 break;
1754 default:
1755 hres = to_double(arg, &n);
1756 if(FAILED(hres))
1757 return hres;
1760 return return_double(res, round(n));
1763 static HRESULT Global_Escape(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1765 FIXME("\n");
1766 return E_NOTIMPL;
1769 static HRESULT Global_Unescape(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1771 FIXME("\n");
1772 return E_NOTIMPL;
1775 static HRESULT Global_Eval(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1777 FIXME("\n");
1778 return E_NOTIMPL;
1781 static HRESULT Global_Execute(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1783 FIXME("\n");
1784 return E_NOTIMPL;
1787 static HRESULT Global_ExecuteGlobal(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1789 FIXME("\n");
1790 return E_NOTIMPL;
1793 static HRESULT Global_GetRef(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1795 FIXME("\n");
1796 return E_NOTIMPL;
1799 static const string_constant_t vbCr = {1, {'\r'}};
1800 static const string_constant_t vbCrLf = {2, {'\r','\n'}};
1801 static const string_constant_t vbNewLine = {2, {'\r','\n'}};
1802 static const string_constant_t vbFormFeed = {1, {0xc}};
1803 static const string_constant_t vbLf = {1, {'\n'}};
1804 static const string_constant_t vbNullChar = {1};
1805 static const string_constant_t vbNullString = {0};
1806 static const string_constant_t vbTab = {1, {'\t'}};
1807 static const string_constant_t vbVerticalTab = {1, {0xb}};
1809 static const builtin_prop_t global_props[] = {
1810 {DISPID_GLOBAL_VBUSESYSTEM, NULL, BP_GET, VT_I2, 0},
1811 {DISPID_GLOBAL_USESYSTEMDAYOFWEEK, NULL, BP_GET, VT_I2, 0},
1812 {DISPID_GLOBAL_VBSUNDAY, NULL, BP_GET, VT_I2, 1},
1813 {DISPID_GLOBAL_VBMONDAY, NULL, BP_GET, VT_I2, 2},
1814 {DISPID_GLOBAL_VBTUESDAY, NULL, BP_GET, VT_I2, 3},
1815 {DISPID_GLOBAL_VBWEDNESDAY, NULL, BP_GET, VT_I2, 4},
1816 {DISPID_GLOBAL_VBTHURSDAY, NULL, BP_GET, VT_I2, 5},
1817 {DISPID_GLOBAL_VBFRIDAY, NULL, BP_GET, VT_I2, 6},
1818 {DISPID_GLOBAL_VBSATURDAY, NULL, BP_GET, VT_I2, 7},
1819 {DISPID_GLOBAL_VBFIRSTJAN1, NULL, BP_GET, VT_I2, 1},
1820 {DISPID_GLOBAL_VBFIRSTFOURDAYS, NULL, BP_GET, VT_I2, 2},
1821 {DISPID_GLOBAL_VBFIRSTFULLWEEK, NULL, BP_GET, VT_I2, 3},
1822 {DISPID_GLOBAL_VBOKONLY, NULL, BP_GET, VT_I2, MB_OK},
1823 {DISPID_GLOBAL_VBOKCANCEL, NULL, BP_GET, VT_I2, MB_OKCANCEL},
1824 {DISPID_GLOBAL_VBABORTRETRYIGNORE, NULL, BP_GET, VT_I2, MB_ABORTRETRYIGNORE},
1825 {DISPID_GLOBAL_VBYESNOCANCEL, NULL, BP_GET, VT_I2, MB_YESNOCANCEL},
1826 {DISPID_GLOBAL_VBYESNO, NULL, BP_GET, VT_I2, MB_YESNO},
1827 {DISPID_GLOBAL_VBRETRYCANCEL, NULL, BP_GET, VT_I2, MB_RETRYCANCEL},
1828 {DISPID_GLOBAL_VBCRITICAL, NULL, BP_GET, VT_I2, MB_ICONHAND},
1829 {DISPID_GLOBAL_VBQUESTION, NULL, BP_GET, VT_I2, MB_ICONQUESTION},
1830 {DISPID_GLOBAL_VBEXCLAMATION, NULL, BP_GET, VT_I2, MB_ICONEXCLAMATION},
1831 {DISPID_GLOBAL_VBINFORMATION, NULL, BP_GET, VT_I2, MB_ICONASTERISK},
1832 {DISPID_GLOBAL_VBDEFAULTBUTTON1, NULL, BP_GET, VT_I2, MB_DEFBUTTON1},
1833 {DISPID_GLOBAL_VBDEFAULTBUTTON2, NULL, BP_GET, VT_I2, MB_DEFBUTTON2},
1834 {DISPID_GLOBAL_VBDEFAULTBUTTON3, NULL, BP_GET, VT_I2, MB_DEFBUTTON3},
1835 {DISPID_GLOBAL_VBDEFAULTBUTTON4, NULL, BP_GET, VT_I2, MB_DEFBUTTON4},
1836 {DISPID_GLOBAL_VBAPPLICATIONMODAL, NULL, BP_GET, VT_I2, MB_APPLMODAL},
1837 {DISPID_GLOBAL_VBSYSTEMMODAL, NULL, BP_GET, VT_I2, MB_SYSTEMMODAL},
1838 {DISPID_GLOBAL_VBOK, NULL, BP_GET, VT_I2, IDOK},
1839 {DISPID_GLOBAL_VBCANCEL, NULL, BP_GET, VT_I2, IDCANCEL},
1840 {DISPID_GLOBAL_VBABORT, NULL, BP_GET, VT_I2, IDABORT},
1841 {DISPID_GLOBAL_VBRETRY, NULL, BP_GET, VT_I2, IDRETRY},
1842 {DISPID_GLOBAL_VBIGNORE, NULL, BP_GET, VT_I2, IDIGNORE},
1843 {DISPID_GLOBAL_VBYES, NULL, BP_GET, VT_I2, IDYES},
1844 {DISPID_GLOBAL_VBNO, NULL, BP_GET, VT_I2, IDNO},
1845 {DISPID_GLOBAL_VBEMPTY, NULL, BP_GET, VT_I2, VT_EMPTY},
1846 {DISPID_GLOBAL_VBNULL, NULL, BP_GET, VT_I2, VT_NULL},
1847 {DISPID_GLOBAL_VBINTEGER, NULL, BP_GET, VT_I2, VT_I2},
1848 {DISPID_GLOBAL_VBLONG, NULL, BP_GET, VT_I2, VT_I4},
1849 {DISPID_GLOBAL_VBSINGLE, NULL, BP_GET, VT_I2, VT_R4},
1850 {DISPID_GLOBAL_VBDOUBLE, NULL, BP_GET, VT_I2, VT_R8},
1851 {DISPID_GLOBAL_VBCURRENCY, NULL, BP_GET, VT_I2, VT_CY},
1852 {DISPID_GLOBAL_VBDATE, NULL, BP_GET, VT_I2, VT_DATE},
1853 {DISPID_GLOBAL_VBSTRING, NULL, BP_GET, VT_I2, VT_BSTR},
1854 {DISPID_GLOBAL_VBOBJECT, NULL, BP_GET, VT_I2, VT_DISPATCH},
1855 {DISPID_GLOBAL_VBERROR, NULL, BP_GET, VT_I2, VT_ERROR},
1856 {DISPID_GLOBAL_VBBOOLEAN, NULL, BP_GET, VT_I2, VT_BOOL},
1857 {DISPID_GLOBAL_VBVARIANT, NULL, BP_GET, VT_I2, VT_VARIANT},
1858 {DISPID_GLOBAL_VBDATAOBJECT, NULL, BP_GET, VT_I2, VT_UNKNOWN},
1859 {DISPID_GLOBAL_VBDECIMAL, NULL, BP_GET, VT_I2, VT_DECIMAL},
1860 {DISPID_GLOBAL_VBBYTE, NULL, BP_GET, VT_I2, VT_UI1},
1861 {DISPID_GLOBAL_VBARRAY, NULL, BP_GET, VT_I2, VT_ARRAY},
1862 {DISPID_GLOBAL_VBTRUE, NULL, BP_GET, VT_I2, VARIANT_TRUE},
1863 {DISPID_GLOBAL_VBFALSE, NULL, BP_GET, VT_I2, VARIANT_FALSE},
1864 {DISPID_GLOBAL_VBUSEDEFAULT, NULL, BP_GET, VT_I2, -2},
1865 {DISPID_GLOBAL_VBBINARYCOMPARE, NULL, BP_GET, VT_I2, 0},
1866 {DISPID_GLOBAL_VBTEXTCOMPARE, NULL, BP_GET, VT_I2, 1},
1867 {DISPID_GLOBAL_VBDATABASECOMPARE, NULL, BP_GET, VT_I2, 2},
1868 {DISPID_GLOBAL_VBGENERALDATE, NULL, BP_GET, VT_I2, 0},
1869 {DISPID_GLOBAL_VBLONGDATE, NULL, BP_GET, VT_I2, 1},
1870 {DISPID_GLOBAL_VBSHORTDATE, NULL, BP_GET, VT_I2, 2},
1871 {DISPID_GLOBAL_VBLONGTIME, NULL, BP_GET, VT_I2, 3},
1872 {DISPID_GLOBAL_VBSHORTTIME, NULL, BP_GET, VT_I2, 4},
1873 {DISPID_GLOBAL_VBOBJECTERROR, NULL, BP_GET, VT_I4, 0x80040000},
1874 {DISPID_GLOBAL_VBBLACK, NULL, BP_GET, VT_I4, 0x000000},
1875 {DISPID_GLOBAL_VBBLUE, NULL, BP_GET, VT_I4, 0xff0000},
1876 {DISPID_GLOBAL_VBCYAN, NULL, BP_GET, VT_I4, 0xffff00},
1877 {DISPID_GLOBAL_VBGREEN, NULL, BP_GET, VT_I4, 0x00ff00},
1878 {DISPID_GLOBAL_VBMAGENTA, NULL, BP_GET, VT_I4, 0xff00ff},
1879 {DISPID_GLOBAL_VBRED, NULL, BP_GET, VT_I4, 0x0000ff},
1880 {DISPID_GLOBAL_VBWHITE, NULL, BP_GET, VT_I4, 0xffffff},
1881 {DISPID_GLOBAL_VBYELLOW, NULL, BP_GET, VT_I4, 0x00ffff},
1882 {DISPID_GLOBAL_VBCR, NULL, BP_GET, VT_BSTR, (UINT_PTR)&vbCr},
1883 {DISPID_GLOBAL_VBCRLF, NULL, BP_GET, VT_BSTR, (UINT_PTR)&vbCrLf},
1884 {DISPID_GLOBAL_VBNEWLINE, NULL, BP_GET, VT_BSTR, (UINT_PTR)&vbNewLine},
1885 {DISPID_GLOBAL_VBFORMFEED, NULL, BP_GET, VT_BSTR, (UINT_PTR)&vbFormFeed},
1886 {DISPID_GLOBAL_VBLF, NULL, BP_GET, VT_BSTR, (UINT_PTR)&vbLf},
1887 {DISPID_GLOBAL_VBNULLCHAR, NULL, BP_GET, VT_BSTR, (UINT_PTR)&vbNullChar},
1888 {DISPID_GLOBAL_VBNULLSTRING, NULL, BP_GET, VT_BSTR, (UINT_PTR)&vbNullString},
1889 {DISPID_GLOBAL_VBTAB, NULL, BP_GET, VT_BSTR, (UINT_PTR)&vbTab},
1890 {DISPID_GLOBAL_VBVERTICALTAB, NULL, BP_GET, VT_BSTR, (UINT_PTR)&vbVerticalTab},
1891 {DISPID_GLOBAL_CCUR, Global_CCur, 0, 1},
1892 {DISPID_GLOBAL_CINT, Global_CInt, 0, 1},
1893 {DISPID_GLOBAL_CLNG, Global_CLng, 0, 1},
1894 {DISPID_GLOBAL_CBOOL, Global_CBool, 0, 1},
1895 {DISPID_GLOBAL_CBYTE, Global_CByte, 0, 1},
1896 {DISPID_GLOBAL_CDATE, Global_CDate, 0, 1},
1897 {DISPID_GLOBAL_CDBL, Global_CDbl, 0, 1},
1898 {DISPID_GLOBAL_CSNG, Global_CSng, 0, 1},
1899 {DISPID_GLOBAL_CSTR, Global_CStr, 0, 1},
1900 {DISPID_GLOBAL_HEX, Global_Hex, 0, 1},
1901 {DISPID_GLOBAL_OCT, Global_Oct, 0, 1},
1902 {DISPID_GLOBAL_VARTYPE, Global_VarType, 0, 1},
1903 {DISPID_GLOBAL_ISDATE, Global_IsDate, 0, 1},
1904 {DISPID_GLOBAL_ISEMPTY, Global_IsEmpty, 0, 1},
1905 {DISPID_GLOBAL_ISNULL, Global_IsNull, 0, 1},
1906 {DISPID_GLOBAL_ISNUMERIC, Global_IsNumeric, 0, 1},
1907 {DISPID_GLOBAL_ISARRAY, Global_IsArray, 0, 1},
1908 {DISPID_GLOBAL_ISOBJECT, Global_IsObject, 0, 1},
1909 {DISPID_GLOBAL_ATN, Global_Ant, 0, 1},
1910 {DISPID_GLOBAL_COS, Global_Cos, 0, 1},
1911 {DISPID_GLOBAL_SIN, Global_Sin, 0, 1},
1912 {DISPID_GLOBAL_TAN, Global_Tan, 0, 1},
1913 {DISPID_GLOBAL_EXP, Global_Exp, 0, 1},
1914 {DISPID_GLOBAL_LOG, Global_Log, 0, 1},
1915 {DISPID_GLOBAL_SQR, Global_Sqr, 0, 1},
1916 {DISPID_GLOBAL_RANDOMIZE, Global_Randomize, 0, 1},
1917 {DISPID_GLOBAL_RND, Global_Rnd, 0, 1},
1918 {DISPID_GLOBAL_TIMER, Global_Timer, 0, 0},
1919 {DISPID_GLOBAL_LBOUND, Global_LBound, 0, 1},
1920 {DISPID_GLOBAL_UBOUND, Global_UBound, 0, 1},
1921 {DISPID_GLOBAL_RGB, Global_RGB, 0, 3},
1922 {DISPID_GLOBAL_LEN, Global_Len, 0, 1},
1923 {DISPID_GLOBAL_LENB, Global_LenB, 0, 1},
1924 {DISPID_GLOBAL_LEFT, Global_Left, 0, 2},
1925 {DISPID_GLOBAL_LEFTB, Global_LeftB, 0, 2},
1926 {DISPID_GLOBAL_RIGHT, Global_Right, 0, 2},
1927 {DISPID_GLOBAL_RIGHTB, Global_RightB, 0, 2},
1928 {DISPID_GLOBAL_MID, Global_Mid, 0, 2, 3},
1929 {DISPID_GLOBAL_MIDB, Global_MidB, 0, 2, 3},
1930 {DISPID_GLOBAL_STRCOMP, Global_StrComp, 0, 2, 3},
1931 {DISPID_GLOBAL_LCASE, Global_LCase, 0, 1},
1932 {DISPID_GLOBAL_UCASE, Global_UCase, 0, 1},
1933 {DISPID_GLOBAL_LTRIM, Global_LTrim, 0, 1},
1934 {DISPID_GLOBAL_RTRIM, Global_RTrim, 0, 1},
1935 {DISPID_GLOBAL_TRIM, Global_Trim, 0, 1},
1936 {DISPID_GLOBAL_SPACE, Global_Space, 0, 1},
1937 {DISPID_GLOBAL_STRING, Global_String, 0, 0, 2},
1938 {DISPID_GLOBAL_INSTR, Global_InStr, 0, 2, 4},
1939 {DISPID_GLOBAL_INSTRB, Global_InStrB, 0, 3, 4},
1940 {DISPID_GLOBAL_ASCB, Global_AscB, 0, 1},
1941 {DISPID_GLOBAL_CHRB, Global_ChrB, 0, 1},
1942 {DISPID_GLOBAL_ASC, Global_Asc, 0, 1},
1943 {DISPID_GLOBAL_CHR, Global_Chr, 0, 1},
1944 {DISPID_GLOBAL_ASCW, Global_AscW, 0, 1},
1945 {DISPID_GLOBAL_CHRW, Global_ChrW, 0, 1},
1946 {DISPID_GLOBAL_ABS, Global_Abs, 0, 1},
1947 {DISPID_GLOBAL_FIX, Global_Fix, 0, 1},
1948 {DISPID_GLOBAL_INT, Global_Int, 0, 1},
1949 {DISPID_GLOBAL_SGN, Global_Sgn, 0, 1},
1950 {DISPID_GLOBAL_NOW, Global_Now, 0, 0},
1951 {DISPID_GLOBAL_DATE, Global_Date, 0, 0},
1952 {DISPID_GLOBAL_TIME, Global_Time, 0, 0},
1953 {DISPID_GLOBAL_DAY, Global_Day, 0, 1},
1954 {DISPID_GLOBAL_MONTH, Global_Month, 0, 1},
1955 {DISPID_GLOBAL_WEEKDAY, Global_Weekday, 0, 1, 2},
1956 {DISPID_GLOBAL_YEAR, Global_Year, 0, 1},
1957 {DISPID_GLOBAL_HOUR, Global_Hour, 0, 1},
1958 {DISPID_GLOBAL_MINUTE, Global_Minute, 0, 1},
1959 {DISPID_GLOBAL_SECOND, Global_Second, 0, 1},
1960 {DISPID_GLOBAL_DATEVALUE, Global_DateValue, 0, 1},
1961 {DISPID_GLOBAL_TIMEVALUE, Global_TimeValue, 0, 1},
1962 {DISPID_GLOBAL_DATESERIAL, Global_DateSerial, 0, 3},
1963 {DISPID_GLOBAL_TIMESERIAL, Global_TimeSerial, 0, 3},
1964 {DISPID_GLOBAL_INPUTBOX, Global_InputBox, 0, 1, 7},
1965 {DISPID_GLOBAL_MSGBOX, Global_MsgBox, 0, 1, 5},
1966 {DISPID_GLOBAL_CREATEOBJECT, Global_CreateObject, 0, 1},
1967 {DISPID_GLOBAL_GETOBJECT, Global_GetObject, 0, 0, 2},
1968 {DISPID_GLOBAL_DATEADD, Global_DateAdd, 0, 3},
1969 {DISPID_GLOBAL_DATEDIFF, Global_DateDiff, 0, 3, 5},
1970 {DISPID_GLOBAL_DATEPART, Global_DatePart, 0, 2, 4},
1971 {DISPID_GLOBAL_TYPENAME, Global_TypeName, 0, 1},
1972 {DISPID_GLOBAL_ARRAY, Global_Array, 0, 1},
1973 {DISPID_GLOBAL_ERASE, Global_Erase, 0, 1},
1974 {DISPID_GLOBAL_FILTER, Global_Filter, 0, 2, 4},
1975 {DISPID_GLOBAL_JOIN, Global_Join, 0, 1, 2},
1976 {DISPID_GLOBAL_SPLIT, Global_Split, 0, 1, 4},
1977 {DISPID_GLOBAL_REPLACE, Global_Replace, 0, 3, 6},
1978 {DISPID_GLOBAL_STRREVERSE, Global_StrReverse, 0, 1},
1979 {DISPID_GLOBAL_INSTRREV, Global_InStrRev, 0, 2, 4},
1980 {DISPID_GLOBAL_LOADPICTURE, Global_LoadPicture, 0, 1},
1981 {DISPID_GLOBAL_SCRIPTENGINE, Global_ScriptEngine, 0, 0},
1982 {DISPID_GLOBAL_SCRIPTENGINEMAJORVERSION, Global_ScriptEngineMajorVersion, 0, 0},
1983 {DISPID_GLOBAL_SCRIPTENGINEMINORVERSION, Global_ScriptEngineMinorVersion, 0, 0},
1984 {DISPID_GLOBAL_SCRIPTENGINEBUILDVERSION, Global_ScriptEngineBuildVersion, 0, 0},
1985 {DISPID_GLOBAL_FORMATNUMBER, Global_FormatNumber, 0, 1, 5},
1986 {DISPID_GLOBAL_FORMATCURRENCY, Global_FormatCurrency, 0, 1, 5},
1987 {DISPID_GLOBAL_FORMATPERCENT, Global_FormatPercent, 0, 1, 5},
1988 {DISPID_GLOBAL_FORMATDATETIME, Global_FormatDateTime, 0, 1, 2},
1989 {DISPID_GLOBAL_WEEKDAYNAME, Global_WeekdayName, 0, 1, 3},
1990 {DISPID_GLOBAL_MONTHNAME, Global_MonthName, 0, 1, 2},
1991 {DISPID_GLOBAL_ROUND, Global_Round, 0, 1, 2},
1992 {DISPID_GLOBAL_ESCAPE, Global_Escape, 0, 1},
1993 {DISPID_GLOBAL_UNESCAPE, Global_Unescape, 0, 1},
1994 {DISPID_GLOBAL_EVAL, Global_Eval, 0, 1},
1995 {DISPID_GLOBAL_EXECUTE, Global_Execute, 0, 1},
1996 {DISPID_GLOBAL_EXECUTEGLOBAL, Global_ExecuteGlobal, 0, 1},
1997 {DISPID_GLOBAL_GETREF, Global_GetRef, 0, 1},
1998 {DISPID_GLOBAL_VBMSGBOXHELPBUTTON, NULL, BP_GET, VT_I4, MB_HELP},
1999 {DISPID_GLOBAL_VBMSGBOXSETFOREGROUND, NULL, BP_GET, VT_I4, MB_SETFOREGROUND},
2000 {DISPID_GLOBAL_VBMSGBOXRIGHT, NULL, BP_GET, VT_I4, MB_RIGHT},
2001 {DISPID_GLOBAL_VBMSGBOXRTLREADING, NULL, BP_GET, VT_I4, MB_RTLREADING}
2004 static HRESULT Err_Description(vbdisp_t *This, VARIANT *args, unsigned args_cnt, VARIANT *res)
2006 FIXME("\n");
2007 return E_NOTIMPL;
2010 static HRESULT Err_HelpContext(vbdisp_t *This, VARIANT *args, unsigned args_cnt, VARIANT *res)
2012 FIXME("\n");
2013 return E_NOTIMPL;
2016 static HRESULT Err_HelpFile(vbdisp_t *This, VARIANT *args, unsigned args_cnt, VARIANT *res)
2018 FIXME("\n");
2019 return E_NOTIMPL;
2022 static HRESULT Err_Number(vbdisp_t *This, VARIANT *args, unsigned args_cnt, VARIANT *res)
2024 HRESULT hres;
2026 TRACE("\n");
2028 if(!This->desc)
2029 return E_UNEXPECTED;
2031 if(args_cnt) {
2032 FIXME("setter not implemented\n");
2033 return E_NOTIMPL;
2036 hres = This->desc->ctx->err_number;
2037 return return_int(res, HRESULT_FACILITY(hres) == FACILITY_VBS ? HRESULT_CODE(hres) : hres);
2040 static HRESULT Err_Source(vbdisp_t *This, VARIANT *args, unsigned args_cnt, VARIANT *res)
2042 FIXME("\n");
2043 return E_NOTIMPL;
2046 static HRESULT Err_Clear(vbdisp_t *This, VARIANT *args, unsigned args_cnt, VARIANT *res)
2048 TRACE("\n");
2050 if(!This->desc)
2051 return E_UNEXPECTED;
2053 This->desc->ctx->err_number = S_OK;
2054 return S_OK;
2057 static HRESULT Err_Raise(vbdisp_t *This, VARIANT *args, unsigned args_cnt, VARIANT *res)
2059 FIXME("\n");
2060 return E_NOTIMPL;
2063 static const builtin_prop_t err_props[] = {
2064 {DISPID_ERR_DESCRIPTION, Err_Description, BP_GETPUT},
2065 {DISPID_ERR_HELPCONTEXT, Err_HelpContext, BP_GETPUT},
2066 {DISPID_ERR_HELPFILE, Err_HelpFile, BP_GETPUT},
2067 {DISPID_ERR_NUMBER, Err_Number, BP_GETPUT},
2068 {DISPID_ERR_SOURCE, Err_Source, BP_GETPUT},
2069 {DISPID_ERR_CLEAR, Err_Clear},
2070 {DISPID_ERR_RAISE, Err_Raise, 0, 5},
2073 HRESULT init_global(script_ctx_t *ctx)
2075 HRESULT hres;
2077 ctx->global_desc.ctx = ctx;
2078 ctx->global_desc.builtin_prop_cnt = sizeof(global_props)/sizeof(*global_props);
2079 ctx->global_desc.builtin_props = global_props;
2081 hres = get_typeinfo(GlobalObj_tid, &ctx->global_desc.typeinfo);
2082 if(FAILED(hres))
2083 return hres;
2085 hres = create_vbdisp(&ctx->global_desc, &ctx->global_obj);
2086 if(FAILED(hres))
2087 return hres;
2089 hres = create_script_disp(ctx, &ctx->script_obj);
2090 if(FAILED(hres))
2091 return hres;
2093 ctx->err_desc.ctx = ctx;
2094 ctx->err_desc.builtin_prop_cnt = sizeof(err_props)/sizeof(*err_props);
2095 ctx->err_desc.builtin_props = err_props;
2097 hres = get_typeinfo(ErrObj_tid, &ctx->err_desc.typeinfo);
2098 if(FAILED(hres))
2099 return hres;
2101 return create_vbdisp(&ctx->err_desc, &ctx->err_obj);