vbscript: Lookup visible items before global members in lookup_identifier.
[wine] / dlls / vbscript / global.c
1 /*
2  * Copyright 2011 Jacek Caban for CodeWeavers
3  *
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.
8  *
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.
13  *
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
17  */
18
19 #include <assert.h>
20
21 #include "vbscript.h"
22 #include "vbscript_defs.h"
23
24 #include "mshtmhst.h"
25 #include "objsafe.h"
26
27 #include "wine/debug.h"
28
29 WINE_DEFAULT_DEBUG_CHANNEL(vbscript);
30
31 #define VB_E_CANNOT_CREATE_OBJ 0x800a01ad
32
33 /* Defined as extern in urlmon.idl, but not exported by uuid.lib */
34 const GUID GUID_CUSTOM_CONFIRMOBJECTSAFETY =
35     {0x10200490,0xfa38,0x11d0,{0xac,0x0e,0x00,0xa0,0xc9,0xf,0xff,0xc0}};
36
37 static IInternetHostSecurityManager *get_sec_mgr(script_ctx_t *ctx)
38 {
39     IInternetHostSecurityManager *secmgr;
40     IServiceProvider *sp;
41     HRESULT hres;
42
43     if(!ctx->site)
44         return NULL;
45
46     if(ctx->secmgr)
47         return ctx->secmgr;
48
49     hres = IActiveScriptSite_QueryInterface(ctx->site, &IID_IServiceProvider, (void**)&sp);
50     if(FAILED(hres))
51         return NULL;
52
53     hres = IServiceProvider_QueryService(sp, &SID_SInternetHostSecurityManager, &IID_IInternetHostSecurityManager,
54             (void**)&secmgr);
55     IServiceProvider_Release(sp);
56     if(FAILED(hres))
57         return NULL;
58
59     return ctx->secmgr = secmgr;
60 }
61
62 static HRESULT return_bstr(VARIANT *res, const WCHAR *str)
63 {
64     BSTR ret;
65
66     if(!res)
67         return S_OK;
68
69     ret = SysAllocString(str);
70     if(!ret)
71         return E_OUTOFMEMORY;
72
73     V_VT(res) = VT_BSTR;
74     V_BSTR(res) = ret;
75     return S_OK;
76 }
77
78 static HRESULT return_short(VARIANT *res, short val)
79 {
80     if(res) {
81         V_VT(res) = VT_I2;
82         V_I2(res) = val;
83     }
84
85     return S_OK;
86 }
87
88 static HRESULT return_int(VARIANT *res, int val)
89 {
90     if((short)val == val)
91         return return_short(res, val);
92
93     if(res) {
94         V_VT(res) = VT_I4;
95         V_I4(res) = val;
96     }
97
98     return S_OK;
99 }
100
101 static inline HRESULT return_null(VARIANT *res)
102 {
103     if(res)
104         V_VT(res) = VT_NULL;
105     return S_OK;
106 }
107
108 static IUnknown *create_object(script_ctx_t *ctx, const WCHAR *progid)
109 {
110     IInternetHostSecurityManager *secmgr = NULL;
111     IObjectWithSite *obj_site;
112     struct CONFIRMSAFETY cs;
113     IClassFactoryEx *cfex;
114     IClassFactory *cf;
115     DWORD policy_size;
116     BYTE *bpolicy;
117     IUnknown *obj;
118     DWORD policy;
119     GUID guid;
120     HRESULT hres;
121
122     hres = CLSIDFromProgID(progid, &guid);
123     if(FAILED(hres))
124         return NULL;
125
126     TRACE("GUID %s\n", debugstr_guid(&guid));
127
128     if(ctx->safeopt & INTERFACE_USES_SECURITY_MANAGER) {
129         secmgr = get_sec_mgr(ctx);
130         if(!secmgr)
131             return NULL;
132
133         policy = 0;
134         hres = IInternetHostSecurityManager_ProcessUrlAction(secmgr, URLACTION_ACTIVEX_RUN,
135                 (BYTE*)&policy, sizeof(policy), (BYTE*)&guid, sizeof(GUID), 0, 0);
136         if(FAILED(hres) || policy != URLPOLICY_ALLOW)
137             return NULL;
138     }
139
140     hres = CoGetClassObject(&guid, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, NULL, &IID_IClassFactory, (void**)&cf);
141     if(FAILED(hres))
142         return NULL;
143
144     hres = IClassFactory_QueryInterface(cf, &IID_IClassFactoryEx, (void**)&cfex);
145     if(SUCCEEDED(hres)) {
146         FIXME("Use IClassFactoryEx\n");
147         IClassFactoryEx_Release(cfex);
148     }
149
150     hres = IClassFactory_CreateInstance(cf, NULL, &IID_IUnknown, (void**)&obj);
151     if(FAILED(hres))
152         return NULL;
153
154     if(secmgr) {
155         cs.clsid = guid;
156         cs.pUnk = obj;
157         cs.dwFlags = 0;
158         hres = IInternetHostSecurityManager_QueryCustomPolicy(secmgr, &GUID_CUSTOM_CONFIRMOBJECTSAFETY,
159                 &bpolicy, &policy_size, (BYTE*)&cs, sizeof(cs), 0);
160         if(SUCCEEDED(hres)) {
161             policy = policy_size >= sizeof(DWORD) ? *(DWORD*)bpolicy : URLPOLICY_DISALLOW;
162             CoTaskMemFree(bpolicy);
163         }
164
165         if(FAILED(hres) || policy != URLPOLICY_ALLOW) {
166             IUnknown_Release(obj);
167             return NULL;
168         }
169     }
170
171     hres = IUnknown_QueryInterface(obj, &IID_IObjectWithSite, (void**)&obj_site);
172     if(SUCCEEDED(hres)) {
173         IUnknown *ax_site;
174
175         ax_site = create_ax_site(ctx);
176         if(ax_site) {
177             hres = IObjectWithSite_SetSite(obj_site, ax_site);
178             IUnknown_Release(ax_site);
179         }
180         IObjectWithSite_Release(obj_site);
181         if(!ax_site || FAILED(hres)) {
182             IUnknown_Release(obj);
183             return NULL;
184         }
185     }
186
187     return obj;
188 }
189
190 static HRESULT Global_CCur(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
191 {
192     FIXME("\n");
193     return E_NOTIMPL;
194 }
195
196 static HRESULT Global_CInt(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
197 {
198     FIXME("\n");
199     return E_NOTIMPL;
200 }
201
202 static HRESULT Global_CLng(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
203 {
204     FIXME("\n");
205     return E_NOTIMPL;
206 }
207
208 static HRESULT Global_CBool(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
209 {
210     FIXME("\n");
211     return E_NOTIMPL;
212 }
213
214 static HRESULT Global_CByte(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
215 {
216     FIXME("\n");
217     return E_NOTIMPL;
218 }
219
220 static HRESULT Global_CDate(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
221 {
222     FIXME("\n");
223     return E_NOTIMPL;
224 }
225
226 static HRESULT Global_CDbl(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
227 {
228     FIXME("\n");
229     return E_NOTIMPL;
230 }
231
232 static HRESULT Global_CSng(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
233 {
234     FIXME("\n");
235     return E_NOTIMPL;
236 }
237
238 static HRESULT Global_CStr(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
239 {
240     FIXME("\n");
241     return E_NOTIMPL;
242 }
243
244 static inline WCHAR hex_char(unsigned n)
245 {
246     return n < 10 ? '0'+n : 'A'+n-10;
247 }
248
249 static HRESULT Global_Hex(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
250 {
251     WCHAR buf[17], *ptr;
252     DWORD n;
253
254     TRACE("%s\n", debugstr_variant(arg));
255
256     switch(V_VT(arg)) {
257     case VT_I2:
258         n = (WORD)V_I2(arg);
259         break;
260     case VT_I4:
261         n = V_I4(arg);
262         break;
263     case VT_EMPTY:
264         n = 0;
265         break;
266     case VT_NULL:
267         if(res)
268             V_VT(res) = VT_NULL;
269         return S_OK;
270     default:
271         FIXME("unsupported type %s\n", debugstr_variant(arg));
272         return E_NOTIMPL;
273     }
274
275     buf[16] = 0;
276     ptr = buf+15;
277
278     if(n) {
279         do {
280             *ptr-- = hex_char(n & 0xf);
281             n >>= 4;
282         }while(n);
283         ptr++;
284     }else {
285         *ptr = '0';
286     }
287
288     return return_bstr(res, ptr);
289 }
290
291 static HRESULT Global_Oct(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
292 {
293     FIXME("\n");
294     return E_NOTIMPL;
295 }
296
297 static HRESULT Global_VarType(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
298 {
299     FIXME("\n");
300     return E_NOTIMPL;
301 }
302
303 static HRESULT Global_IsDate(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
304 {
305     FIXME("\n");
306     return E_NOTIMPL;
307 }
308
309 static HRESULT Global_IsEmpty(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
310 {
311     TRACE("(%s)\n", debugstr_variant(arg));
312
313     assert(args_cnt == 1);
314
315     if(res) {
316         V_VT(res) = VT_BOOL;
317         V_BOOL(res) = V_VT(arg) == VT_EMPTY ? VARIANT_TRUE : VARIANT_FALSE;
318     }
319     return S_OK;
320 }
321
322 static HRESULT Global_IsNull(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
323 {
324     TRACE("(%s)\n", debugstr_variant(arg));
325
326     assert(args_cnt == 1);
327
328     if(res) {
329         V_VT(res) = VT_BOOL;
330         V_BOOL(res) = V_VT(arg) == VT_NULL ? VARIANT_TRUE : VARIANT_FALSE;
331     }
332     return S_OK;
333 }
334
335 static HRESULT Global_IsNumeric(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
336 {
337     FIXME("\n");
338     return E_NOTIMPL;
339 }
340
341 static HRESULT Global_IsArray(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
342 {
343     FIXME("\n");
344     return E_NOTIMPL;
345 }
346
347 static HRESULT Global_IsObject(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
348 {
349     TRACE("(%s)\n", debugstr_variant(arg));
350
351     assert(args_cnt == 1);
352
353     if(res) {
354         V_VT(res) = VT_BOOL;
355         V_BOOL(res) = V_VT(arg) == VT_DISPATCH ? VARIANT_TRUE : VARIANT_FALSE;
356     }
357     return S_OK;
358 }
359
360 static HRESULT Global_Ant(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
361 {
362     FIXME("\n");
363     return E_NOTIMPL;
364 }
365
366 static HRESULT Global_Cos(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
367 {
368     FIXME("\n");
369     return E_NOTIMPL;
370 }
371
372 static HRESULT Global_Sin(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
373 {
374     FIXME("\n");
375     return E_NOTIMPL;
376 }
377
378 static HRESULT Global_Tan(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
379 {
380     FIXME("\n");
381     return E_NOTIMPL;
382 }
383
384 static HRESULT Global_Exp(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
385 {
386     FIXME("\n");
387     return E_NOTIMPL;
388 }
389
390 static HRESULT Global_Log(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
391 {
392     FIXME("\n");
393     return E_NOTIMPL;
394 }
395
396 static HRESULT Global_Sqr(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
397 {
398     FIXME("\n");
399     return E_NOTIMPL;
400 }
401
402 static HRESULT Global_Randomize(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
403 {
404     FIXME("\n");
405     return E_NOTIMPL;
406 }
407
408 static HRESULT Global_Rnd(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
409 {
410     FIXME("\n");
411     return E_NOTIMPL;
412 }
413
414 static HRESULT Global_Timer(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
415 {
416     FIXME("\n");
417     return E_NOTIMPL;
418 }
419
420 static HRESULT Global_LBound(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
421 {
422     FIXME("\n");
423     return E_NOTIMPL;
424 }
425
426 static HRESULT Global_UBound(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
427 {
428     FIXME("\n");
429     return E_NOTIMPL;
430 }
431
432 static HRESULT Global_RGB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
433 {
434     FIXME("\n");
435     return E_NOTIMPL;
436 }
437
438 static HRESULT Global_Len(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
439 {
440     FIXME("\n");
441     return E_NOTIMPL;
442 }
443
444 static HRESULT Global_LenB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
445 {
446     FIXME("\n");
447     return E_NOTIMPL;
448 }
449
450 static HRESULT Global_Left(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
451 {
452     FIXME("\n");
453     return E_NOTIMPL;
454 }
455
456 static HRESULT Global_LeftB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
457 {
458     FIXME("\n");
459     return E_NOTIMPL;
460 }
461
462 static HRESULT Global_Right(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
463 {
464     FIXME("\n");
465     return E_NOTIMPL;
466 }
467
468 static HRESULT Global_RightB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
469 {
470     FIXME("\n");
471     return E_NOTIMPL;
472 }
473
474 static HRESULT Global_Mid(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
475 {
476     FIXME("\n");
477     return E_NOTIMPL;
478 }
479
480 static HRESULT Global_MidB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
481 {
482     FIXME("\n");
483     return E_NOTIMPL;
484 }
485
486 static HRESULT Global_StrComp(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
487 {
488     FIXME("\n");
489     return E_NOTIMPL;
490 }
491
492 static HRESULT Global_LCase(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
493 {
494     FIXME("\n");
495     return E_NOTIMPL;
496 }
497
498 static HRESULT Global_UCase(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
499 {
500     FIXME("\n");
501     return E_NOTIMPL;
502 }
503
504 static HRESULT Global_LTrim(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
505 {
506     FIXME("\n");
507     return E_NOTIMPL;
508 }
509
510 static HRESULT Global_RTrim(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
511 {
512     FIXME("\n");
513     return E_NOTIMPL;
514 }
515
516 static HRESULT Global_Trim(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
517 {
518     FIXME("\n");
519     return E_NOTIMPL;
520 }
521
522 static HRESULT Global_Space(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
523 {
524     FIXME("\n");
525     return E_NOTIMPL;
526 }
527
528 static HRESULT Global_String(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
529 {
530     FIXME("\n");
531     return E_NOTIMPL;
532 }
533
534 static HRESULT Global_InStr(vbdisp_t *This, VARIANT *args, unsigned args_cnt, VARIANT *res)
535 {
536     VARIANT *startv, *str1v, *str2v;
537     BSTR str1, str2;
538     int start, ret;
539
540     TRACE("\n");
541
542     switch(args_cnt) {
543     case 2:
544         startv = NULL;
545         str1v = args+1;
546         str2v = args;
547         break;
548     case 3:
549         startv = args+2;
550         str1v = args+1;
551         str2v = args;
552         break;
553     case 4:
554         FIXME("unsupported compare argument %s\n", debugstr_variant(args));
555         return E_NOTIMPL;
556     default:
557         assert(0);
558     }
559
560     if(startv) {
561         /* FIXME: Move to helper */
562         switch(V_VT(startv)) {
563         case VT_I2:
564             start = V_I2(startv);
565             break;
566         case VT_I4:
567             start = V_I4(startv);
568             break;
569         default:
570             FIXME("unsupported start %s\n", debugstr_variant(startv));
571             return E_NOTIMPL;
572         }
573         if(--start < 0) {
574             FIXME("start %d\n", start);
575             return E_FAIL;
576         }
577     }else {
578         start = 0;
579     }
580
581     if(V_VT(str1v) == VT_NULL || V_VT(str2v) == VT_NULL)
582         return return_null(res);
583
584     if(V_VT(str1v) != VT_BSTR) {
585         FIXME("Unsupported str1 type %s\n", debugstr_variant(str1v));
586         return E_NOTIMPL;
587     }
588     str1 = V_BSTR(str1v);
589
590     if(V_VT(str2v) != VT_BSTR) {
591         FIXME("Unsupported str2 type %s\n", debugstr_variant(str2v));
592         return E_NOTIMPL;
593     }
594     str2 = V_BSTR(str2v);
595
596     if(start < SysStringLen(str1)) {
597         WCHAR *ptr;
598
599         ptr = strstrW(str1+start, str2);
600         ret = ptr ? ptr-str1+1 : 0;
601     }else {
602         ret = 0;
603     }
604
605     return return_int(res, ret);
606 }
607
608 static HRESULT Global_InStrB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
609 {
610     FIXME("\n");
611     return E_NOTIMPL;
612 }
613
614 static HRESULT Global_AscB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
615 {
616     FIXME("\n");
617     return E_NOTIMPL;
618 }
619
620 static HRESULT Global_ChrB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
621 {
622     FIXME("\n");
623     return E_NOTIMPL;
624 }
625
626 static HRESULT Global_Asc(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
627 {
628     FIXME("\n");
629     return E_NOTIMPL;
630 }
631
632 static HRESULT Global_Chr(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
633 {
634     FIXME("\n");
635     return E_NOTIMPL;
636 }
637
638 static HRESULT Global_AscW(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
639 {
640     FIXME("\n");
641     return E_NOTIMPL;
642 }
643
644 static HRESULT Global_ChrW(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
645 {
646     FIXME("\n");
647     return E_NOTIMPL;
648 }
649
650 static HRESULT Global_Abs(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
651 {
652     FIXME("\n");
653     return E_NOTIMPL;
654 }
655
656 static HRESULT Global_Fix(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
657 {
658     FIXME("\n");
659     return E_NOTIMPL;
660 }
661
662 static HRESULT Global_Int(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
663 {
664     FIXME("\n");
665     return E_NOTIMPL;
666 }
667
668 static HRESULT Global_Sgn(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
669 {
670     FIXME("\n");
671     return E_NOTIMPL;
672 }
673
674 static HRESULT Global_Now(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
675 {
676     FIXME("\n");
677     return E_NOTIMPL;
678 }
679
680 static HRESULT Global_Date(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
681 {
682     FIXME("\n");
683     return E_NOTIMPL;
684 }
685
686 static HRESULT Global_Time(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
687 {
688     FIXME("\n");
689     return E_NOTIMPL;
690 }
691
692 static HRESULT Global_Day(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
693 {
694     FIXME("\n");
695     return E_NOTIMPL;
696 }
697
698 static HRESULT Global_Month(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
699 {
700     FIXME("\n");
701     return E_NOTIMPL;
702 }
703
704 static HRESULT Global_Weekday(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
705 {
706     FIXME("\n");
707     return E_NOTIMPL;
708 }
709
710 static HRESULT Global_Year(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
711 {
712     FIXME("\n");
713     return E_NOTIMPL;
714 }
715
716 static HRESULT Global_Hour(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
717 {
718     FIXME("\n");
719     return E_NOTIMPL;
720 }
721
722 static HRESULT Global_Minute(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
723 {
724     FIXME("\n");
725     return E_NOTIMPL;
726 }
727
728 static HRESULT Global_Second(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
729 {
730     FIXME("\n");
731     return E_NOTIMPL;
732 }
733
734 static HRESULT Global_DateValue(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
735 {
736     FIXME("\n");
737     return E_NOTIMPL;
738 }
739
740 static HRESULT Global_TimeValue(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
741 {
742     FIXME("\n");
743     return E_NOTIMPL;
744 }
745
746 static HRESULT Global_DateSerial(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
747 {
748     FIXME("\n");
749     return E_NOTIMPL;
750 }
751
752 static HRESULT Global_TimeSerial(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
753 {
754     FIXME("\n");
755     return E_NOTIMPL;
756 }
757
758 static HRESULT Global_InputBox(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
759 {
760     FIXME("\n");
761     return E_NOTIMPL;
762 }
763
764 static HRESULT Global_MsgBox(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
765 {
766     FIXME("\n");
767     return E_NOTIMPL;
768 }
769
770 static HRESULT Global_CreateObject(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
771 {
772     IUnknown *obj;
773     HRESULT hres;
774
775     TRACE("(%s)\n", debugstr_variant(arg));
776
777     if(V_VT(arg) != VT_BSTR) {
778         FIXME("non-bstr arg\n");
779         return E_INVALIDARG;
780     }
781
782     obj = create_object(This->desc->ctx, V_BSTR(arg));
783     if(!obj)
784         return VB_E_CANNOT_CREATE_OBJ;
785
786     if(res) {
787         hres = IUnknown_QueryInterface(obj, &IID_IDispatch, (void**)&V_DISPATCH(res));
788         if(FAILED(hres))
789             return hres;
790
791         V_VT(res) = VT_DISPATCH;
792     }
793
794     IUnknown_Release(obj);
795     return S_OK;
796 }
797
798 static HRESULT Global_GetObject(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
799 {
800     FIXME("\n");
801     return E_NOTIMPL;
802 }
803
804 static HRESULT Global_DateAdd(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
805 {
806     FIXME("\n");
807     return E_NOTIMPL;
808 }
809
810 static HRESULT Global_DateDiff(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
811 {
812     FIXME("\n");
813     return E_NOTIMPL;
814 }
815
816 static HRESULT Global_DatePart(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
817 {
818     FIXME("\n");
819     return E_NOTIMPL;
820 }
821
822 static HRESULT Global_TypeName(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
823 {
824     FIXME("\n");
825     return E_NOTIMPL;
826 }
827
828 static HRESULT Global_Array(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
829 {
830     FIXME("\n");
831     return E_NOTIMPL;
832 }
833
834 static HRESULT Global_Erase(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
835 {
836     FIXME("\n");
837     return E_NOTIMPL;
838 }
839
840 static HRESULT Global_Filter(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
841 {
842     FIXME("\n");
843     return E_NOTIMPL;
844 }
845
846 static HRESULT Global_Join(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
847 {
848     FIXME("\n");
849     return E_NOTIMPL;
850 }
851
852 static HRESULT Global_Split(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
853 {
854     FIXME("\n");
855     return E_NOTIMPL;
856 }
857
858 static HRESULT Global_Replace(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
859 {
860     FIXME("\n");
861     return E_NOTIMPL;
862 }
863
864 static HRESULT Global_StrReverse(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
865 {
866     FIXME("\n");
867     return E_NOTIMPL;
868 }
869
870 static HRESULT Global_InStrRev(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
871 {
872     FIXME("\n");
873     return E_NOTIMPL;
874 }
875
876 static HRESULT Global_LoadPicture(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
877 {
878     FIXME("\n");
879     return E_NOTIMPL;
880 }
881
882 static HRESULT Global_ScriptEngine(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
883 {
884     FIXME("\n");
885     return E_NOTIMPL;
886 }
887
888 static HRESULT Global_ScriptEngineMajorVersion(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
889 {
890     FIXME("\n");
891     return E_NOTIMPL;
892 }
893
894 static HRESULT Global_ScriptEngineMinorVersion(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
895 {
896     FIXME("\n");
897     return E_NOTIMPL;
898 }
899
900 static HRESULT Global_ScriptEngineBuildVersion(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
901 {
902     FIXME("\n");
903     return E_NOTIMPL;
904 }
905
906 static HRESULT Global_FormatNumber(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
907 {
908     FIXME("\n");
909     return E_NOTIMPL;
910 }
911
912 static HRESULT Global_FormatCurrency(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
913 {
914     FIXME("\n");
915     return E_NOTIMPL;
916 }
917
918 static HRESULT Global_FormatPercent(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
919 {
920     FIXME("\n");
921     return E_NOTIMPL;
922 }
923
924 static HRESULT Global_FormatDateTime(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
925 {
926     FIXME("\n");
927     return E_NOTIMPL;
928 }
929
930 static HRESULT Global_WeekdayName(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
931 {
932     FIXME("\n");
933     return E_NOTIMPL;
934 }
935
936 static HRESULT Global_MonthName(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
937 {
938     FIXME("\n");
939     return E_NOTIMPL;
940 }
941
942 static HRESULT Global_Round(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
943 {
944     FIXME("\n");
945     return E_NOTIMPL;
946 }
947
948 static HRESULT Global_Escape(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
949 {
950     FIXME("\n");
951     return E_NOTIMPL;
952 }
953
954 static HRESULT Global_Unescape(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
955 {
956     FIXME("\n");
957     return E_NOTIMPL;
958 }
959
960 static HRESULT Global_Eval(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
961 {
962     FIXME("\n");
963     return E_NOTIMPL;
964 }
965
966 static HRESULT Global_Execute(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
967 {
968     FIXME("\n");
969     return E_NOTIMPL;
970 }
971
972 static HRESULT Global_ExecuteGlobal(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
973 {
974     FIXME("\n");
975     return E_NOTIMPL;
976 }
977
978 static HRESULT Global_GetRef(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
979 {
980     FIXME("\n");
981     return E_NOTIMPL;
982 }
983
984 static HRESULT Global_vbUseSystem(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
985 {
986     FIXME("\n");
987     return E_NOTIMPL;
988 }
989
990 static HRESULT Global_vbUseSystemDayOfWeek(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
991 {
992     FIXME("\n");
993     return E_NOTIMPL;
994 }
995
996 static HRESULT Global_vbSunday(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
997 {
998     TRACE("\n");
999     return return_short(res, 1);
1000 }
1001
1002 static HRESULT Global_vbMonday(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1003 {
1004     TRACE("\n");
1005     return return_short(res, 2);
1006 }
1007
1008 static HRESULT Global_vbTuesday(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1009 {
1010     TRACE("\n");
1011     return return_short(res, 3);
1012 }
1013
1014 static HRESULT Global_vbWednesday(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1015 {
1016     TRACE("\n");
1017     return return_short(res, 4);
1018 }
1019
1020 static HRESULT Global_vbThursday(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1021 {
1022     TRACE("\n");
1023     return return_short(res, 5);
1024 }
1025
1026 static HRESULT Global_vbFriday(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1027 {
1028     TRACE("\n");
1029     return return_short(res, 6);
1030 }
1031
1032 static HRESULT Global_vbSaturday(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1033 {
1034     TRACE("\n");
1035     return return_short(res, 7);
1036 }
1037
1038 static HRESULT Global_vbFirstJan1(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1039 {
1040     FIXME("\n");
1041     return E_NOTIMPL;
1042 }
1043
1044 static HRESULT Global_vbFirstFourDays(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1045 {
1046     FIXME("\n");
1047     return E_NOTIMPL;
1048 }
1049
1050 static HRESULT Global_vbFirstFullWeek(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1051 {
1052     FIXME("\n");
1053     return E_NOTIMPL;
1054 }
1055
1056 static HRESULT Global_vbOKOnly(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1057 {
1058     FIXME("\n");
1059     return E_NOTIMPL;
1060 }
1061
1062 static HRESULT Global_vbOKCancel(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1063 {
1064     FIXME("\n");
1065     return E_NOTIMPL;
1066 }
1067
1068 static HRESULT Global_vbAbortRetryIgnore(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1069 {
1070     FIXME("\n");
1071     return E_NOTIMPL;
1072 }
1073
1074 static HRESULT Global_vbYesNoCancel(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1075 {
1076     FIXME("\n");
1077     return E_NOTIMPL;
1078 }
1079
1080 static HRESULT Global_vbYesNo(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1081 {
1082     FIXME("\n");
1083     return E_NOTIMPL;
1084 }
1085
1086 static HRESULT Global_vbRetryCancel(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1087 {
1088     FIXME("\n");
1089     return E_NOTIMPL;
1090 }
1091
1092 static HRESULT Global_vbCritical(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1093 {
1094     FIXME("\n");
1095     return E_NOTIMPL;
1096 }
1097
1098 static HRESULT Global_vbQuestion(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1099 {
1100     FIXME("\n");
1101     return E_NOTIMPL;
1102 }
1103
1104 static HRESULT Global_vbExclamation(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1105 {
1106     FIXME("\n");
1107     return E_NOTIMPL;
1108 }
1109
1110 static HRESULT Global_vbInformation(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1111 {
1112     FIXME("\n");
1113     return E_NOTIMPL;
1114 }
1115
1116 static HRESULT Global_vbDefaultButton1(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1117 {
1118     FIXME("\n");
1119     return E_NOTIMPL;
1120 }
1121
1122 static HRESULT Global_vbDefaultButton2(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1123 {
1124     FIXME("\n");
1125     return E_NOTIMPL;
1126 }
1127
1128 static HRESULT Global_vbDefaultButton3(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1129 {
1130     FIXME("\n");
1131     return E_NOTIMPL;
1132 }
1133
1134 static HRESULT Global_vbDefaultButton4(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1135 {
1136     FIXME("\n");
1137     return E_NOTIMPL;
1138 }
1139
1140 static HRESULT Global_vbApplicationModal(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1141 {
1142     FIXME("\n");
1143     return E_NOTIMPL;
1144 }
1145
1146 static HRESULT Global_vbSystemModal(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1147 {
1148     FIXME("\n");
1149     return E_NOTIMPL;
1150 }
1151
1152 static HRESULT Global_vbOK(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1153 {
1154     FIXME("\n");
1155     return E_NOTIMPL;
1156 }
1157
1158 static HRESULT Global_vbCancel(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1159 {
1160     FIXME("\n");
1161     return E_NOTIMPL;
1162 }
1163
1164 static HRESULT Global_vbAbort(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1165 {
1166     FIXME("\n");
1167     return E_NOTIMPL;
1168 }
1169
1170 static HRESULT Global_vbRetry(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1171 {
1172     FIXME("\n");
1173     return E_NOTIMPL;
1174 }
1175
1176 static HRESULT Global_vbIgnore(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1177 {
1178     FIXME("\n");
1179     return E_NOTIMPL;
1180 }
1181
1182 static HRESULT Global_vbYes(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1183 {
1184     FIXME("\n");
1185     return E_NOTIMPL;
1186 }
1187
1188 static HRESULT Global_vbNo(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1189 {
1190     FIXME("\n");
1191     return E_NOTIMPL;
1192 }
1193
1194 static HRESULT Global_vbEmpty(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1195 {
1196     FIXME("\n");
1197     return E_NOTIMPL;
1198 }
1199
1200 static HRESULT Global_vbNull(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1201 {
1202     FIXME("\n");
1203     return E_NOTIMPL;
1204 }
1205
1206 static HRESULT Global_vbInteger(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1207 {
1208     FIXME("\n");
1209     return E_NOTIMPL;
1210 }
1211
1212 static HRESULT Global_vbLong(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1213 {
1214     FIXME("\n");
1215     return E_NOTIMPL;
1216 }
1217
1218 static HRESULT Global_vbSingle(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1219 {
1220     FIXME("\n");
1221     return E_NOTIMPL;
1222 }
1223
1224 static HRESULT Global_vbDouble(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1225 {
1226     FIXME("\n");
1227     return E_NOTIMPL;
1228 }
1229
1230 static HRESULT Global_vbCurrency(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1231 {
1232     FIXME("\n");
1233     return E_NOTIMPL;
1234 }
1235
1236 static HRESULT Global_vbDate(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1237 {
1238     FIXME("\n");
1239     return E_NOTIMPL;
1240 }
1241
1242 static HRESULT Global_vbString(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1243 {
1244     FIXME("\n");
1245     return E_NOTIMPL;
1246 }
1247
1248 static HRESULT Global_vbObject(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1249 {
1250     FIXME("\n");
1251     return E_NOTIMPL;
1252 }
1253
1254 static HRESULT Global_vbError(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1255 {
1256     FIXME("\n");
1257     return E_NOTIMPL;
1258 }
1259
1260 static HRESULT Global_vbBoolean(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1261 {
1262     FIXME("\n");
1263     return E_NOTIMPL;
1264 }
1265
1266 static HRESULT Global_vbVariant(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1267 {
1268     FIXME("\n");
1269     return E_NOTIMPL;
1270 }
1271
1272 static HRESULT Global_vbDataObject(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1273 {
1274     FIXME("\n");
1275     return E_NOTIMPL;
1276 }
1277
1278 static HRESULT Global_vbDecimal(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1279 {
1280     FIXME("\n");
1281     return E_NOTIMPL;
1282 }
1283
1284 static HRESULT Global_vbByte(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1285 {
1286     FIXME("\n");
1287     return E_NOTIMPL;
1288 }
1289
1290 static HRESULT Global_vbArray(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1291 {
1292     FIXME("\n");
1293     return E_NOTIMPL;
1294 }
1295
1296 static HRESULT Global_vbTrue(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1297 {
1298     FIXME("\n");
1299     return E_NOTIMPL;
1300 }
1301
1302 static HRESULT Global_vbFalse(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1303 {
1304     FIXME("\n");
1305     return E_NOTIMPL;
1306 }
1307
1308 static HRESULT Global_vbUseDefault(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1309 {
1310     FIXME("\n");
1311     return E_NOTIMPL;
1312 }
1313
1314 static HRESULT Global_vbBinaryCompare(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1315 {
1316     FIXME("\n");
1317     return E_NOTIMPL;
1318 }
1319
1320 static HRESULT Global_vbTextCompare(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1321 {
1322     FIXME("\n");
1323     return E_NOTIMPL;
1324 }
1325
1326 static HRESULT Global_vbDatabaseCompare(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1327 {
1328     FIXME("\n");
1329     return E_NOTIMPL;
1330 }
1331
1332 static HRESULT Global_vbGeneralDate(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1333 {
1334     FIXME("\n");
1335     return E_NOTIMPL;
1336 }
1337
1338 static HRESULT Global_vbLongDate(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1339 {
1340     FIXME("\n");
1341     return E_NOTIMPL;
1342 }
1343
1344 static HRESULT Global_vbShortDate(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1345 {
1346     FIXME("\n");
1347     return E_NOTIMPL;
1348 }
1349
1350 static HRESULT Global_vbLongTime(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1351 {
1352     FIXME("\n");
1353     return E_NOTIMPL;
1354 }
1355
1356 static HRESULT Global_vbShortTime(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1357 {
1358     FIXME("\n");
1359     return E_NOTIMPL;
1360 }
1361
1362 static HRESULT Global_vbObjectError(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1363 {
1364     FIXME("\n");
1365     return E_NOTIMPL;
1366 }
1367
1368 static HRESULT Global_vbBlack(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1369 {
1370     FIXME("\n");
1371     return E_NOTIMPL;
1372 }
1373
1374 static HRESULT Global_vbBlue(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1375 {
1376     FIXME("\n");
1377     return E_NOTIMPL;
1378 }
1379
1380 static HRESULT Global_vbCyan(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1381 {
1382     FIXME("\n");
1383     return E_NOTIMPL;
1384 }
1385
1386 static HRESULT Global_vbGreen(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1387 {
1388     FIXME("\n");
1389     return E_NOTIMPL;
1390 }
1391
1392 static HRESULT Global_vbMagenta(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1393 {
1394     FIXME("\n");
1395     return E_NOTIMPL;
1396 }
1397
1398 static HRESULT Global_vbRed(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1399 {
1400     FIXME("\n");
1401     return E_NOTIMPL;
1402 }
1403
1404 static HRESULT Global_vbWhite(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1405 {
1406     FIXME("\n");
1407     return E_NOTIMPL;
1408 }
1409
1410 static HRESULT Global_vbYellow(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1411 {
1412     FIXME("\n");
1413     return E_NOTIMPL;
1414 }
1415
1416 static HRESULT Global_vbCr(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1417 {
1418     FIXME("\n");
1419     return E_NOTIMPL;
1420 }
1421
1422 static HRESULT Global_vbCrLf(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1423 {
1424     FIXME("\n");
1425     return E_NOTIMPL;
1426 }
1427
1428 static HRESULT Global_vbNewLine(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1429 {
1430     FIXME("\n");
1431     return E_NOTIMPL;
1432 }
1433
1434 static HRESULT Global_vbFormFeed(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1435 {
1436     FIXME("\n");
1437     return E_NOTIMPL;
1438 }
1439
1440 static HRESULT Global_vbLf(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1441 {
1442     FIXME("\n");
1443     return E_NOTIMPL;
1444 }
1445
1446 static HRESULT Global_vbNullChar(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1447 {
1448     FIXME("\n");
1449     return E_NOTIMPL;
1450 }
1451
1452 static HRESULT Global_vbNullString(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1453 {
1454     FIXME("\n");
1455     return E_NOTIMPL;
1456 }
1457
1458 static HRESULT Global_vbTab(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1459 {
1460     FIXME("\n");
1461     return E_NOTIMPL;
1462 }
1463
1464 static HRESULT Global_vbVerticalTab(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1465 {
1466     FIXME("\n");
1467     return E_NOTIMPL;
1468 }
1469
1470 static HRESULT Global_vbMsgBoxHelpButton(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1471 {
1472     FIXME("\n");
1473     return E_NOTIMPL;
1474 }
1475
1476 static HRESULT Global_vbMsgBoxSetForeground(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1477 {
1478     FIXME("\n");
1479     return E_NOTIMPL;
1480 }
1481
1482 static HRESULT Global_vbMsgBoxRight(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1483 {
1484     FIXME("\n");
1485     return E_NOTIMPL;
1486 }
1487
1488 static HRESULT Global_vbMsgBoxRtlReading(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1489 {
1490     FIXME("\n");
1491     return E_NOTIMPL;
1492 }
1493
1494 static const builtin_prop_t global_props[] = {
1495     {DISPID_GLOBAL_VBUSESYSTEM,        Global_vbUseSystem, BP_GET},
1496     {DISPID_GLOBAL_USESYSTEMDAYOFWEEK, Global_vbUseSystemDayOfWeek, BP_GET},
1497     {DISPID_GLOBAL_VBSUNDAY,           Global_vbSunday, BP_GET},
1498     {DISPID_GLOBAL_VBMONDAY,           Global_vbMonday, BP_GET},
1499     {DISPID_GLOBAL_VBTUESDAY,          Global_vbTuesday, BP_GET},
1500     {DISPID_GLOBAL_VBWEDNESDAY,        Global_vbWednesday, BP_GET},
1501     {DISPID_GLOBAL_VBTHURSDAY,         Global_vbThursday, BP_GET},
1502     {DISPID_GLOBAL_VBFRIDAY,           Global_vbFriday, BP_GET},
1503     {DISPID_GLOBAL_VBSATURDAY,         Global_vbSaturday, BP_GET},
1504     {DISPID_GLOBAL_VBFIRSTJAN1,        Global_vbFirstJan1, BP_GET},
1505     {DISPID_GLOBAL_VBFIRSTFOURDAYS,    Global_vbFirstFourDays, BP_GET},
1506     {DISPID_GLOBAL_VBFIRSTFULLWEEK,    Global_vbFirstFullWeek, BP_GET},
1507     {DISPID_GLOBAL_VBOKONLY,           Global_vbOKOnly, BP_GET},
1508     {DISPID_GLOBAL_VBOKCANCEL,         Global_vbOKCancel, BP_GET},
1509     {DISPID_GLOBAL_VBABORTRETRYIGNORE, Global_vbAbortRetryIgnore, BP_GET},
1510     {DISPID_GLOBAL_VBYESNOCANCEL,      Global_vbYesNoCancel, BP_GET},
1511     {DISPID_GLOBAL_VBYESNO,            Global_vbYesNo, BP_GET},
1512     {DISPID_GLOBAL_VBRETRYCANCEL,      Global_vbRetryCancel, BP_GET},
1513     {DISPID_GLOBAL_VBCRITICAL,         Global_vbCritical, BP_GET},
1514     {DISPID_GLOBAL_VBQUESTION,         Global_vbQuestion, BP_GET},
1515     {DISPID_GLOBAL_VBEXCLAMATION,      Global_vbExclamation, BP_GET},
1516     {DISPID_GLOBAL_VBINFORMATION,      Global_vbInformation, BP_GET},
1517     {DISPID_GLOBAL_VBDEFAULTBUTTON1,   Global_vbDefaultButton1, BP_GET},
1518     {DISPID_GLOBAL_VBDEFAULTBUTTON2,   Global_vbDefaultButton2, BP_GET},
1519     {DISPID_GLOBAL_VBDEFAULTBUTTON3,   Global_vbDefaultButton3, BP_GET},
1520     {DISPID_GLOBAL_VBDEFAULTBUTTON4,   Global_vbDefaultButton4, BP_GET},
1521     {DISPID_GLOBAL_VBAPPLICATIONMODAL, Global_vbApplicationModal, BP_GET},
1522     {DISPID_GLOBAL_VBSYSTEMMODAL,      Global_vbSystemModal, BP_GET},
1523     {DISPID_GLOBAL_VBOK,               Global_vbOK, BP_GET},
1524     {DISPID_GLOBAL_VBCANCEL,           Global_vbCancel, BP_GET},
1525     {DISPID_GLOBAL_VBABORT,            Global_vbAbort, BP_GET},
1526     {DISPID_GLOBAL_VBRETRY,            Global_vbRetry, BP_GET},
1527     {DISPID_GLOBAL_VBIGNORE,           Global_vbIgnore, BP_GET},
1528     {DISPID_GLOBAL_VBYES,              Global_vbYes, BP_GET},
1529     {DISPID_GLOBAL_VBNO,               Global_vbNo, BP_GET},
1530     {DISPID_GLOBAL_VBEMPTY,            Global_vbEmpty, BP_GET},
1531     {DISPID_GLOBAL_VBNULL,             Global_vbNull, BP_GET},
1532     {DISPID_GLOBAL_VBINTEGER,          Global_vbInteger, BP_GET},
1533     {DISPID_GLOBAL_VBLONG,             Global_vbLong, BP_GET},
1534     {DISPID_GLOBAL_VBSINGLE,           Global_vbSingle, BP_GET},
1535     {DISPID_GLOBAL_VBDOUBLE,           Global_vbDouble, BP_GET},
1536     {DISPID_GLOBAL_VBCURRENCY,         Global_vbCurrency, BP_GET},
1537     {DISPID_GLOBAL_VBDATE,             Global_vbDate, BP_GET},
1538     {DISPID_GLOBAL_VBSTRING,           Global_vbString, BP_GET},
1539     {DISPID_GLOBAL_VBOBJECT,           Global_vbObject, BP_GET},
1540     {DISPID_GLOBAL_VBERROR,            Global_vbError, BP_GET},
1541     {DISPID_GLOBAL_VBBOOLEAN,          Global_vbBoolean, BP_GET},
1542     {DISPID_GLOBAL_VBVARIANT,          Global_vbVariant, BP_GET},
1543     {DISPID_GLOBAL_VBDATAOBJECT,       Global_vbDataObject, BP_GET},
1544     {DISPID_GLOBAL_VBDECIMAL,          Global_vbDecimal, BP_GET},
1545     {DISPID_GLOBAL_VBBYTE,             Global_vbByte, BP_GET},
1546     {DISPID_GLOBAL_VBARRAY,            Global_vbArray, BP_GET},
1547     {DISPID_GLOBAL_VBTRUE,             Global_vbTrue, BP_GET},
1548     {DISPID_GLOBAL_VBFALSE,            Global_vbFalse, BP_GET},
1549     {DISPID_GLOBAL_VBUSEDEFAULT,       Global_vbUseDefault, BP_GET},
1550     {DISPID_GLOBAL_VBBINARYCOMPARE,    Global_vbBinaryCompare, BP_GET},
1551     {DISPID_GLOBAL_VBTEXTCOMPARE,      Global_vbTextCompare, BP_GET},
1552     {DISPID_GLOBAL_VBDATABASECOMPARE,  Global_vbDatabaseCompare, BP_GET},
1553     {DISPID_GLOBAL_VBGENERALDATE,      Global_vbGeneralDate, BP_GET},
1554     {DISPID_GLOBAL_VBLONGDATE,         Global_vbLongDate, BP_GET},
1555     {DISPID_GLOBAL_VBSHORTDATE,        Global_vbShortDate, BP_GET},
1556     {DISPID_GLOBAL_VBLONGTIME,         Global_vbLongTime, BP_GET},
1557     {DISPID_GLOBAL_VBSHORTTIME,        Global_vbShortTime, BP_GET},
1558     {DISPID_GLOBAL_VBOBJECTERROR,      Global_vbObjectError, BP_GET},
1559     {DISPID_GLOBAL_VBBLACK,            Global_vbBlack, BP_GET},
1560     {DISPID_GLOBAL_VBBLUE,             Global_vbBlue, BP_GET},
1561     {DISPID_GLOBAL_VBCYAN,             Global_vbCyan, BP_GET},
1562     {DISPID_GLOBAL_VBGREEN,            Global_vbGreen, BP_GET},
1563     {DISPID_GLOBAL_VBMAGENTA,          Global_vbMagenta, BP_GET},
1564     {DISPID_GLOBAL_VBRED,              Global_vbRed, BP_GET},
1565     {DISPID_GLOBAL_VBWHITE,            Global_vbWhite, BP_GET},
1566     {DISPID_GLOBAL_VBYELLOW,           Global_vbYellow, BP_GET},
1567     {DISPID_GLOBAL_VBCR,               Global_vbCr, BP_GET},
1568     {DISPID_GLOBAL_VBCRLF,             Global_vbCrLf, BP_GET},
1569     {DISPID_GLOBAL_VBNEWLINE,          Global_vbNewLine, BP_GET},
1570     {DISPID_GLOBAL_VBFORMFEED,         Global_vbFormFeed, BP_GET},
1571     {DISPID_GLOBAL_VBLF,               Global_vbLf, BP_GET},
1572     {DISPID_GLOBAL_VBNULLCHAR,         Global_vbNullChar, BP_GET},
1573     {DISPID_GLOBAL_VBNULLSTRING,       Global_vbNullString, BP_GET},
1574     {DISPID_GLOBAL_VBTAB,              Global_vbTab, BP_GET},
1575     {DISPID_GLOBAL_VBVERTICALTAB,      Global_vbVerticalTab, BP_GET},
1576     {DISPID_GLOBAL_CCUR,                      Global_CCur, 0, 1},
1577     {DISPID_GLOBAL_CINT,                      Global_CInt, 0, 1},
1578     {DISPID_GLOBAL_CLNG,                      Global_CLng, 0, 1},
1579     {DISPID_GLOBAL_CBOOL,                     Global_CBool, 0, 1},
1580     {DISPID_GLOBAL_CBYTE,                     Global_CByte, 0, 1},
1581     {DISPID_GLOBAL_CDATE,                     Global_CDate, 0, 1},
1582     {DISPID_GLOBAL_CDBL,                      Global_CDbl, 0, 1},
1583     {DISPID_GLOBAL_CSNG,                      Global_CSng, 0, 1},
1584     {DISPID_GLOBAL_CSTR,                      Global_CStr, 0, 1},
1585     {DISPID_GLOBAL_HEX,                       Global_Hex, 0, 1},
1586     {DISPID_GLOBAL_OCT,                       Global_Oct, 0, 1},
1587     {DISPID_GLOBAL_VARTYPE,                   Global_VarType, 0, 1},
1588     {DISPID_GLOBAL_ISDATE,                    Global_IsDate, 0, 1},
1589     {DISPID_GLOBAL_ISEMPTY,                   Global_IsEmpty, 0, 1},
1590     {DISPID_GLOBAL_ISNULL,                    Global_IsNull, 0, 1},
1591     {DISPID_GLOBAL_ISNUMERIC,                 Global_IsNumeric, 0, 1},
1592     {DISPID_GLOBAL_ISARRAY,                   Global_IsArray, 0, 1},
1593     {DISPID_GLOBAL_ISOBJECT,                  Global_IsObject, 0, 1},
1594     {DISPID_GLOBAL_ATN,                       Global_Ant, 0, 1},
1595     {DISPID_GLOBAL_COS,                       Global_Cos, 0, 1},
1596     {DISPID_GLOBAL_SIN,                       Global_Sin, 0, 1},
1597     {DISPID_GLOBAL_TAN,                       Global_Tan, 0, 1},
1598     {DISPID_GLOBAL_EXP,                       Global_Exp, 0, 1},
1599     {DISPID_GLOBAL_LOG,                       Global_Log, 0, 1},
1600     {DISPID_GLOBAL_SQR,                       Global_Sqr, 0, 1},
1601     {DISPID_GLOBAL_RANDOMIZE,                 Global_Randomize, 0, 1},
1602     {DISPID_GLOBAL_RND,                       Global_Rnd, 0, 1},
1603     {DISPID_GLOBAL_TIMER,                     Global_Timer, 0, 0},
1604     {DISPID_GLOBAL_LBOUND,                    Global_LBound, 0, 1},
1605     {DISPID_GLOBAL_UBOUND,                    Global_UBound, 0, 1},
1606     {DISPID_GLOBAL_RGB,                       Global_RGB, 0, 3},
1607     {DISPID_GLOBAL_LEN,                       Global_Len, 0, 1},
1608     {DISPID_GLOBAL_LENB,                      Global_LenB, 0, 1},
1609     {DISPID_GLOBAL_LEFT,                      Global_Left, 0, 2},
1610     {DISPID_GLOBAL_LEFTB,                     Global_LeftB, 0, 2},
1611     {DISPID_GLOBAL_RIGHT,                     Global_Right, 0, 2},
1612     {DISPID_GLOBAL_RIGHTB,                    Global_RightB, 0, 2},
1613     {DISPID_GLOBAL_MID,                       Global_Mid, 0, 2, 3},
1614     {DISPID_GLOBAL_MIDB,                      Global_MidB, 0, 2, 3},
1615     {DISPID_GLOBAL_STRCOMP,                   Global_StrComp, 0, 2, 3},
1616     {DISPID_GLOBAL_LCASE,                     Global_LCase, 0, 1},
1617     {DISPID_GLOBAL_UCASE,                     Global_UCase, 0, 1},
1618     {DISPID_GLOBAL_LTRIM,                     Global_LTrim, 0, 1},
1619     {DISPID_GLOBAL_RTRIM,                     Global_RTrim, 0, 1},
1620     {DISPID_GLOBAL_TRIM,                      Global_Trim, 0, 1},
1621     {DISPID_GLOBAL_SPACE,                     Global_Space, 0, 1},
1622     {DISPID_GLOBAL_STRING,                    Global_String, 0, 0, 2},
1623     {DISPID_GLOBAL_INSTR,                     Global_InStr, 0, 2, 4},
1624     {DISPID_GLOBAL_INSTRB,                    Global_InStrB, 0, 3, 4},
1625     {DISPID_GLOBAL_ASCB,                      Global_AscB, 0, 1},
1626     {DISPID_GLOBAL_CHRB,                      Global_ChrB, 0, 1},
1627     {DISPID_GLOBAL_ASC,                       Global_Asc, 0, 1},
1628     {DISPID_GLOBAL_CHR,                       Global_Chr, 0, 1},
1629     {DISPID_GLOBAL_ASCW,                      Global_AscW, 0, 1},
1630     {DISPID_GLOBAL_CHRW,                      Global_ChrW, 0, 1},
1631     {DISPID_GLOBAL_ABS,                       Global_Abs, 0, 1},
1632     {DISPID_GLOBAL_FIX,                       Global_Fix, 0, 1},
1633     {DISPID_GLOBAL_INT,                       Global_Int, 0, 1},
1634     {DISPID_GLOBAL_SGN,                       Global_Sgn, 0, 1},
1635     {DISPID_GLOBAL_NOW,                       Global_Now, 0, 0},
1636     {DISPID_GLOBAL_DATE,                      Global_Date, 0, 0},
1637     {DISPID_GLOBAL_TIME,                      Global_Time, 0, 0},
1638     {DISPID_GLOBAL_DAY,                       Global_Day, 0, 1},
1639     {DISPID_GLOBAL_MONTH,                     Global_Month, 0, 1},
1640     {DISPID_GLOBAL_WEEKDAY,                   Global_Weekday, 0, 1, 2},
1641     {DISPID_GLOBAL_YEAR,                      Global_Year, 0, 1},
1642     {DISPID_GLOBAL_HOUR,                      Global_Hour, 0, 1},
1643     {DISPID_GLOBAL_MINUTE,                    Global_Minute, 0, 1},
1644     {DISPID_GLOBAL_SECOND,                    Global_Second, 0, 1},
1645     {DISPID_GLOBAL_DATEVALUE,                 Global_DateValue, 0, 1},
1646     {DISPID_GLOBAL_TIMEVALUE,                 Global_TimeValue, 0, 1},
1647     {DISPID_GLOBAL_DATESERIAL,                Global_DateSerial, 0, 3},
1648     {DISPID_GLOBAL_TIMESERIAL,                Global_TimeSerial, 0, 3},
1649     {DISPID_GLOBAL_INPUTBOX,                  Global_InputBox, 0, 1, 7},
1650     {DISPID_GLOBAL_MSGBOX,                    Global_MsgBox, 0, 1, 5},
1651     {DISPID_GLOBAL_CREATEOBJECT,              Global_CreateObject, 0, 1},
1652     {DISPID_GLOBAL_GETOBJECT,                 Global_GetObject, 0, 0, 2},
1653     {DISPID_GLOBAL_DATEADD,                   Global_DateAdd, 0, 3},
1654     {DISPID_GLOBAL_DATEDIFF,                  Global_DateDiff, 0, 3, 5},
1655     {DISPID_GLOBAL_DATEPART,                  Global_DatePart, 0, 2, 4},
1656     {DISPID_GLOBAL_TYPENAME,                  Global_TypeName, 0, 1},
1657     {DISPID_GLOBAL_ARRAY,                     Global_Array, 0, 1},
1658     {DISPID_GLOBAL_ERASE,                     Global_Erase, 0, 1},
1659     {DISPID_GLOBAL_FILTER,                    Global_Filter, 0, 2, 4},
1660     {DISPID_GLOBAL_JOIN,                      Global_Join, 0, 1, 2},
1661     {DISPID_GLOBAL_SPLIT,                     Global_Split, 0, 1, 4},
1662     {DISPID_GLOBAL_REPLACE,                   Global_Replace, 0, 3, 6},
1663     {DISPID_GLOBAL_STRREVERSE,                Global_StrReverse, 0, 1},
1664     {DISPID_GLOBAL_INSTRREV,                  Global_InStrRev, 0, 2, 4},
1665     {DISPID_GLOBAL_LOADPICTURE,               Global_LoadPicture, 0, 1},
1666     {DISPID_GLOBAL_SCRIPTENGINE,              Global_ScriptEngine, 0, 0},
1667     {DISPID_GLOBAL_SCRIPTENGINEMAJORVERSION,  Global_ScriptEngineMajorVersion, 0, 0},
1668     {DISPID_GLOBAL_SCRIPTENGINEMINORVERSION,  Global_ScriptEngineMinorVersion, 0, 0},
1669     {DISPID_GLOBAL_SCRIPTENGINEBUILDVERSION,  Global_ScriptEngineBuildVersion, 0, 0},
1670     {DISPID_GLOBAL_FORMATNUMBER,              Global_FormatNumber, 0, 1, 5},
1671     {DISPID_GLOBAL_FORMATCURRENCY,            Global_FormatCurrency, 0, 1, 5},
1672     {DISPID_GLOBAL_FORMATPERCENT,             Global_FormatPercent, 0, 1, 5},
1673     {DISPID_GLOBAL_FORMATDATETIME,            Global_FormatDateTime, 0, 1, 2},
1674     {DISPID_GLOBAL_WEEKDAYNAME,               Global_WeekdayName, 0, 3},
1675     {DISPID_GLOBAL_MONTHNAME,                 Global_MonthName, 0, 1, 2},
1676     {DISPID_GLOBAL_ROUND,                     Global_Round, 0, 1, 2},
1677     {DISPID_GLOBAL_ESCAPE,                    Global_Escape, 0, 1},
1678     {DISPID_GLOBAL_UNESCAPE,                  Global_Unescape, 0, 1},
1679     {DISPID_GLOBAL_EVAL,                      Global_Eval, 0, 1},
1680     {DISPID_GLOBAL_EXECUTE,                   Global_Execute, 0, 1},
1681     {DISPID_GLOBAL_EXECUTEGLOBAL,             Global_ExecuteGlobal, 0, 1},
1682     {DISPID_GLOBAL_GETREF,                    Global_GetRef, 0, 1},
1683     {DISPID_GLOBAL_VBMSGBOXHELPBUTTON,     Global_vbMsgBoxHelpButton, BP_GET},
1684     {DISPID_GLOBAL_VBMSGBOXSETFOREGROUND,  Global_vbMsgBoxSetForeground, BP_GET},
1685     {DISPID_GLOBAL_VBMSGBOXRIGHT,          Global_vbMsgBoxRight, BP_GET},
1686     {DISPID_GLOBAL_VBMSGBOXRTLREADING,     Global_vbMsgBoxRtlReading, BP_GET}
1687 };
1688
1689 HRESULT init_global(script_ctx_t *ctx)
1690 {
1691     HRESULT hres;
1692
1693     ctx->global_desc.ctx = ctx;
1694     ctx->global_desc.builtin_prop_cnt = sizeof(global_props)/sizeof(*global_props);
1695     ctx->global_desc.builtin_props = global_props;
1696
1697     hres = get_typeinfo(GlobalObj_tid, &ctx->global_desc.typeinfo);
1698     if(FAILED(hres))
1699         return hres;
1700
1701     hres = create_vbdisp(&ctx->global_desc, &ctx->global_obj);
1702     if(FAILED(hres))
1703         return hres;
1704
1705     ctx->script_desc.ctx = ctx;
1706     hres = create_vbdisp(&ctx->script_desc, &ctx->script_obj);
1707     if(FAILED(hres))
1708         return hres;
1709
1710     return init_err(ctx);
1711 }