ReactOS 0.4.17-dev-357-ga8f14ff
jsregexp.c
Go to the documentation of this file.
1/*
2 * Copyright 2008 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 <math.h>
20
21#include "jscript.h"
22#include "regexp.h"
23
24#include "wine/debug.h"
25
27
28typedef struct {
30
36
38{
39 return CONTAINING_RECORD(jsdisp, RegExpInstance, dispex);
40}
41
42static inline RegExpInstance *regexp_this(jsval_t vthis)
43{
44 jsdisp_t *jsdisp = is_object_instance(vthis) ? to_jsdisp(get_object(vthis)) : NULL;
45 return (jsdisp && is_class(jsdisp, JSCLASS_REGEXP)) ? regexp_from_jsdisp(jsdisp) : NULL;
46}
47
48static void set_last_index(RegExpInstance *This, DWORD last_index)
49{
50 This->last_index = last_index;
51 jsval_release(This->last_index_val);
52 This->last_index_val = jsval_number(last_index);
53}
54
56 DWORD rem_flags, jsstr_t *jsstr, const WCHAR *str, match_state_t *ret)
57{
59
60 hres = regexp_execute(regexp->jsregexp, ctx, &ctx->tmp_heap,
61 str, jsstr_length(jsstr), ret);
62 if(FAILED(hres))
63 return hres;
64 if(hres == S_FALSE) {
65 if(rem_flags & REM_RESET_INDEX)
66 set_last_index(regexp, 0);
67 return S_FALSE;
68 }
69
70 if(!(rem_flags & REM_NO_CTX_UPDATE) && ctx->last_match != jsstr) {
71 jsstr_release(ctx->last_match);
72 ctx->last_match = jsstr_addref(jsstr);
73 }
74
75 if(!(rem_flags & REM_NO_CTX_UPDATE)) {
76 DWORD i, n = min(ARRAY_SIZE(ctx->match_parens), ret->paren_count);
77
78 for(i=0; i < n; i++) {
79 if(ret->parens[i].index == -1) {
80 ctx->match_parens[i].index = 0;
81 ctx->match_parens[i].length = 0;
82 }else {
83 ctx->match_parens[i].index = ret->parens[i].index;
84 ctx->match_parens[i].length = ret->parens[i].length;
85 }
86 }
87
88 if(n < ARRAY_SIZE(ctx->match_parens))
89 memset(ctx->match_parens+n, 0, sizeof(ctx->match_parens) - n*sizeof(ctx->match_parens[0]));
90 }
91
92 set_last_index(regexp, ret->cp-str);
93
94 if(!(rem_flags & REM_NO_CTX_UPDATE)) {
95 ctx->last_match_index = ret->cp-str-ret->match_len;
96 ctx->last_match_length = ret->match_len;
97 }
98
99 return S_OK;
100}
101
103 DWORD rem_flags, jsstr_t *jsstr, match_state_t **ret)
104{
105 RegExpInstance *regexp = regexp_from_jsdisp(dispex);
107 heap_pool_t *mark;
108 const WCHAR *str;
110
111 if((rem_flags & REM_CHECK_GLOBAL) && !(regexp->jsregexp->flags & REG_GLOB)) {
112 if(rem_flags & REM_ALLOC_RESULT)
113 *ret = NULL;
114 return S_FALSE;
115 }
116
117 str = jsstr_flatten(jsstr);
118 if(!str)
119 return E_OUTOFMEMORY;
120
121 if(rem_flags & REM_ALLOC_RESULT) {
123 if(!match)
124 return E_OUTOFMEMORY;
125 *ret = match;
126 }
127
128 mark = heap_pool_mark(&ctx->tmp_heap);
129
130 if(rem_flags & REM_NO_PARENS) {
131 match = alloc_match_state(regexp->jsregexp, &ctx->tmp_heap, NULL);
132 if(!match) {
133 heap_pool_clear(mark);
134 return E_OUTOFMEMORY;
135 }
136 match->cp = (*ret)->cp;
137 match->match_len = (*ret)->match_len;
138 }else {
139 match = *ret;
140 }
141
142 hres = do_regexp_match_next(ctx, regexp, rem_flags, jsstr, str, match);
143
144 if(rem_flags & REM_NO_PARENS) {
145 (*ret)->cp = match->cp;
146 (*ret)->match_len = match->match_len;
147 }
148
149 heap_pool_clear(mark);
150
151 if(hres != S_OK && (rem_flags & REM_ALLOC_RESULT)) {
152 free(match);
153 *ret = NULL;
154 }
155
156 return hres;
157}
158
159static HRESULT regexp_match(script_ctx_t *ctx, jsdisp_t *dispex, jsstr_t *jsstr, BOOL gflag,
160 match_result_t **match_result, DWORD *result_cnt)
161{
165 DWORD i=0, ret_size = 0;
166 heap_pool_t *mark;
167 const WCHAR *str;
169
170 mark = heap_pool_mark(&ctx->tmp_heap);
171
172 str = jsstr_flatten(jsstr);
173 if(!str)
174 return E_OUTOFMEMORY;
175
176 result = alloc_match_state(This->jsregexp, &ctx->tmp_heap, str);
177 if(!result) {
178 heap_pool_clear(mark);
179 return E_OUTOFMEMORY;
180 }
181
182 while(1) {
183 hres = do_regexp_match_next(ctx, This, 0, jsstr, str, result);
184 if(hres == S_FALSE) {
185 hres = S_OK;
186 break;
187 }
188
189 if(FAILED(hres))
190 break;
191
192 if(ret_size == i) {
193 if(ret) {
194 match_result_t *old_ret = ret;
195
196 ret = realloc(old_ret, (ret_size <<= 1) * sizeof(match_result_t));
197 if(!ret)
198 free(old_ret);
199 }else {
200 ret = malloc((ret_size=4) * sizeof(match_result_t));
201 }
202 if(!ret) {
204 break;
205 }
206 }
207
208 ret[i].index = result->cp - str - result->match_len;
209 ret[i++].length = result->match_len;
210
211 if (result->match_len == 0)
212 result->cp++;
213
214 if(!gflag && !(This->jsregexp->flags & REG_GLOB)) {
215 hres = S_OK;
216 break;
217 }
218 }
219
220 heap_pool_clear(mark);
221 if(FAILED(hres)) {
222 free(ret);
223 return hres;
224 }
225
226 *match_result = ret;
227 *result_cnt = i;
228 return S_OK;
229}
230
232{
233 TRACE("\n");
234
236 return S_OK;
237}
238
240{
241 TRACE("\n");
242
243 *r = jsval_bool(!!(regexp_from_jsdisp(jsthis)->jsregexp->flags & REG_GLOB));
244 return S_OK;
245}
246
248{
249 TRACE("\n");
250
251 *r = jsval_bool(!!(regexp_from_jsdisp(jsthis)->jsregexp->flags & REG_FOLD));
252 return S_OK;
253}
254
256{
257 TRACE("\n");
258
259 *r = jsval_bool(!!(regexp_from_jsdisp(jsthis)->jsregexp->flags & REG_MULTILINE));
260 return S_OK;
261}
262
264{
265 double n;
267
268 hres = to_number(ctx, v, &n);
269 if(FAILED(hres))
270 return 0;
271
272 n = floor(n);
273 return is_int32(n) ? n : 0;
274}
275
277{
278 RegExpInstance *regexp = regexp_from_jsdisp(jsthis);
279
280 TRACE("\n");
281
282 return jsval_copy(regexp->last_index_val, r);
283}
284
286{
287 RegExpInstance *regexp = regexp_from_jsdisp(jsthis);
289
290 TRACE("\n");
291
293 hres = jsval_copy(value, &regexp->last_index_val);
294 if(FAILED(hres))
295 return hres;
296
298 return S_OK;
299}
300
302 jsval_t *r)
303{
304 RegExpInstance *regexp;
305 unsigned len, f;
306 jsstr_t *ret;
307 WCHAR *ptr;
308
309 TRACE("\n");
310
311 if(!(regexp = regexp_this(vthis))) {
312 WARN("Not a RegExp\n");
314 }
315
316
317 if(!r)
318 return S_OK;
319
320 len = jsstr_length(regexp->str) + 2;
321
322 f = regexp->jsregexp->flags;
323 if(f & REG_FOLD)
324 len++;
325 if(f & REG_GLOB)
326 len++;
327 if(f & REG_MULTILINE)
328 len++;
329
331 if(!ret)
332 return E_OUTOFMEMORY;
333
334 *ptr++ = '/';
335 ptr += jsstr_flush(regexp->str, ptr);
336 *ptr++ = '/';
337
338 if(f & REG_FOLD)
339 *ptr++ = 'i';
340 if(f & REG_GLOB)
341 *ptr++ = 'g';
342 if(f & REG_MULTILINE)
343 *ptr++ = 'm';
344
345 *r = jsval_string(ret);
346 return S_OK;
347}
348
351{
352 const WCHAR *input;
354 jsstr_t *str;
355 DWORD i;
356 HRESULT hres = S_OK;
357
358 input = jsstr_flatten(input_str);
359 if(!input)
360 return E_OUTOFMEMORY;
361
362 hres = create_array(ctx, result->paren_count+1, &array);
363 if(FAILED(hres))
364 return hres;
365
366 for(i=0; i < result->paren_count; i++) {
367 jsval_t val;
368
369 if(result->parens[i].index != -1) {
370 if(!(str = jsstr_substr(input_str, result->parens[i].index, result->parens[i].length))) {
372 break;
373 }
375 }else if(ctx->version < SCRIPTLANGUAGEVERSION_ES5) {
377 }else {
379 }
380
383 if(FAILED(hres))
384 break;
385 }
386
387 while(SUCCEEDED(hres)) {
388 hres = jsdisp_propput_name(array, L"index", jsval_number(result->cp-input-result->match_len));
389 if(FAILED(hres))
390 break;
391
393 if(FAILED(hres))
394 break;
395
396 hres = jsdisp_propput_name(array, L"input", jsval_string(input_str));
397 if(FAILED(hres))
398 break;
399
400 str = jsstr_alloc_len(result->cp-result->match_len, result->match_len);
401 if(!str) {
403 break;
404 }
407 break;
408 }
409
410 if(FAILED(hres)) {
412 return hres;
413 }
414
415 *ret = to_disp(array);
416 return S_OK;
417}
418
421{
422 RegExpInstance *regexp;
424 DWORD last_index = 0;
425 const WCHAR *string;
426 jsstr_t *jsstr;
428
429 if(!(regexp = regexp_this(vthis))) {
430 WARN("Not a RegExp\n");
432 }
433
434 hres = to_flat_string(ctx, arg, &jsstr, &string);
435 if(FAILED(hres))
436 return hres;
437
438 if(regexp->jsregexp->flags & REG_GLOB) {
439 if(regexp->last_index < 0) {
440 jsstr_release(jsstr);
441 set_last_index(regexp, 0);
442 *ret = FALSE;
443 if(input)
444 *input = jsstr_empty();
445 return S_OK;
446 }
447
448 last_index = regexp->last_index;
449 }
450
451 match = alloc_match_state(regexp->jsregexp, &ctx->tmp_heap, string+last_index);
452 if(!match) {
453 jsstr_release(jsstr);
454 return E_OUTOFMEMORY;
455 }
456
457 hres = regexp_match_next(ctx, &regexp->dispex, REM_RESET_INDEX, jsstr, &match);
458 if(FAILED(hres)) {
459 jsstr_release(jsstr);
460 return hres;
461 }
462
463 *result = match;
464 *ret = hres == S_OK;
465 if(input)
466 *input = jsstr;
467 else
468 jsstr_release(jsstr);
469 return S_OK;
470}
471
473 jsval_t *r)
474{
476 heap_pool_t *mark;
477 BOOL b;
480
481 TRACE("\n");
482
483 mark = heap_pool_mark(&ctx->tmp_heap);
484
485 hres = run_exec(ctx, vthis, argc ? argv[0] : jsval_string(jsstr_empty()), &string, &match, &b);
486 if(FAILED(hres)) {
487 heap_pool_clear(mark);
488 return hres;
489 }
490
491 if(r) {
492 if(b) {
493 IDispatch *ret;
494
495 hres = create_match_array(ctx, string, match, &ret);
496 if(SUCCEEDED(hres))
497 *r = jsval_disp(ret);
498 }else {
499 *r = jsval_null();
500 }
501 }
502
503 heap_pool_clear(mark);
504 jsstr_release(string);
505 return hres;
506}
507
509 jsval_t *r)
510{
512 jsstr_t *undef_str;
513 heap_pool_t *mark;
514 BOOL b;
516
517 TRACE("\n");
518
519 mark = heap_pool_mark(&ctx->tmp_heap);
520 hres = run_exec(ctx, vthis, argc ? argv[0] : jsval_string(undef_str = jsstr_undefined()), NULL, &match, &b);
521 heap_pool_clear(mark);
522 if(!argc)
523 jsstr_release(undef_str);
524 if(FAILED(hres))
525 return hres;
526
527 if(r)
528 *r = jsval_bool(b);
529 return S_OK;
530}
531
533 jsval_t *r)
534{
535 TRACE("\n");
536
537 switch(flags) {
538 case INVOKE_FUNC:
540 default:
541 FIXME("unimplemented flags %x\n", flags);
542 return E_NOTIMPL;
543 }
544
545 return S_OK;
546}
547
548static void RegExp_destructor(jsdisp_t *dispex)
549{
551
552 if(This->jsregexp)
553 regexp_destroy(This->jsregexp);
554 jsval_release(This->last_index_val);
555 jsstr_release(This->str);
556}
557
559{
560 return gc_process_linked_val(gc_ctx, op, dispex, &regexp_from_jsdisp(dispex)->last_index_val);
561}
562
563static const builtin_prop_t RegExp_props[] = {
564 {L"exec", RegExp_exec, PROPF_METHOD|1},
565 {L"global", NULL,0, RegExp_get_global},
566 {L"ignoreCase", NULL,0, RegExp_get_ignoreCase},
568 {L"multiline", NULL,0, RegExp_get_multiline},
569 {L"source", NULL,0, RegExp_get_source},
570 {L"test", RegExp_test, PROPF_METHOD|1},
571 {L"toString", RegExp_toString, PROPF_METHOD}
572};
573
576 .call = RegExp_value,
577 .props_cnt = ARRAY_SIZE(RegExp_props),
578 .props = RegExp_props,
579 .destructor = RegExp_destructor,
580 .gc_traverse = RegExp_gc_traverse
581};
582
584 {L"global", NULL,0, RegExp_get_global},
585 {L"ignoreCase", NULL,0, RegExp_get_ignoreCase},
587 {L"multiline", NULL,0, RegExp_get_multiline},
588 {L"source", NULL,0, RegExp_get_source}
589};
590
593 .call = RegExp_value,
594 .props_cnt = ARRAY_SIZE(RegExpInst_props),
595 .props = RegExpInst_props,
596 .destructor = RegExp_destructor,
597 .gc_traverse = RegExp_gc_traverse
598};
599
601{
602 RegExpInstance *regexp;
604
605 regexp = calloc(1, sizeof(RegExpInstance));
606 if(!regexp)
607 return E_OUTOFMEMORY;
608
609 if(object_prototype)
610 hres = init_dispex(&regexp->dispex, ctx, &RegExp_info, object_prototype);
611 else
612 hres = init_dispex_from_constr(&regexp->dispex, ctx, &RegExpInst_info, ctx->regexp_constr);
613
614 if(FAILED(hres)) {
615 free(regexp);
616 return hres;
617 }
618
619 regexp->str = jsstr_addref(str);
620 regexp->last_index_val = jsval_number(0);
621
622 *ret = regexp;
623 return S_OK;
624}
625
627{
628 RegExpInstance *regexp;
629 const WCHAR *str;
631
633 if(!str)
634 return E_OUTOFMEMORY;
635
636 TRACE("%s %lx\n", debugstr_wn(str, jsstr_length(src)), flags);
637
638 hres = alloc_regexp(ctx, src, NULL, &regexp);
639 if(FAILED(hres))
640 return hres;
641
642 regexp->jsregexp = regexp_new(ctx, &ctx->tmp_heap, str, jsstr_length(regexp->str), flags, FALSE);
643 if(!regexp->jsregexp) {
644 WARN("regexp_new failed\n");
645 jsdisp_release(&regexp->dispex);
646 return DISP_E_EXCEPTION;
647 }
648
649 *ret = &regexp->dispex;
650 return S_OK;
651}
652
654{
655 DWORD flags = 0;
656 const WCHAR *opt = NULL;
657 jsstr_t *src;
658 HRESULT hres = S_OK;
659
660 if(is_object_instance(src_arg)) {
661 jsdisp_t *obj;
662
663 obj = to_jsdisp(get_object(src_arg));
664 if(obj) {
667
668 hres = create_regexp(ctx, regexp->str, regexp->jsregexp->flags, ret);
669 return hres;
670 }
671 }
672 }
673
674 if(is_undefined(src_arg))
675 src = jsstr_empty();
676 else
677 hres = to_string(ctx, src_arg, &src);
678 if(FAILED(hres))
679 return hres;
680
681 if(flags_arg && !is_undefined(*flags_arg)) {
682 jsstr_t *opt_str;
683
684 hres = to_string(ctx, *flags_arg, &opt_str);
685 if(SUCCEEDED(hres)) {
686 opt = jsstr_flatten(opt_str);
687 if(opt)
688 hres = parse_regexp_flags(opt, jsstr_length(opt_str), &flags);
689 else
691 jsstr_release(opt_str);
692 }
693 }
694
695 if(SUCCEEDED(hres))
698 return hres;
699}
700
702{
704 match_result_t *match_result;
705 DWORD match_cnt, i;
706 const WCHAR *str;
709
710 str = jsstr_flatten(jsstr);
711 if(!str)
712 return E_OUTOFMEMORY;
713
714 if(!(regexp->jsregexp->flags & REG_GLOB)) {
716 heap_pool_t *mark;
717
718 mark = heap_pool_mark(&ctx->tmp_heap);
719 match = alloc_match_state(regexp->jsregexp, &ctx->tmp_heap, str);
720 if(!match) {
721 heap_pool_clear(mark);
722 return E_OUTOFMEMORY;
723 }
724
725 hres = regexp_match_next(ctx, &regexp->dispex, 0, jsstr, &match);
726 if(FAILED(hres)) {
727 heap_pool_clear(mark);
728 return hres;
729 }
730
731 if(r) {
732 if(hres == S_OK) {
733 IDispatch *ret;
734
735 hres = create_match_array(ctx, jsstr, match, &ret);
736 if(SUCCEEDED(hres))
737 *r = jsval_disp(ret);
738 }else {
739 *r = jsval_null();
740 }
741 }
742
743 heap_pool_clear(mark);
744 return S_OK;
745 }
746
747 hres = regexp_match(ctx, &regexp->dispex, jsstr, FALSE, &match_result, &match_cnt);
748 if(FAILED(hres))
749 return hres;
750
751 if(!match_cnt) {
752 TRACE("no match\n");
753
754 if(r)
755 *r = jsval_null();
756 return S_OK;
757 }
758
759 hres = create_array(ctx, match_cnt, &array);
760 if(FAILED(hres)) {
761 free(match_result);
762 return hres;
763 }
764
765 for(i=0; i < match_cnt; i++) {
766 jsstr_t *tmp_str;
767
768 tmp_str = jsstr_substr(jsstr, match_result[i].index, match_result[i].length);
769 if(!tmp_str) {
771 break;
772 }
773
775 jsstr_release(tmp_str);
776 if(FAILED(hres))
777 break;
778 }
779
780 while(SUCCEEDED(hres)) {
781 hres = jsdisp_propput_name(array, L"index", jsval_number(match_result[match_cnt-1].index));
782 if(FAILED(hres))
783 break;
784
785 hres = jsdisp_propput_name(array, L"lastIndex",
786 jsval_number(match_result[match_cnt-1].index + match_result[match_cnt-1].length));
787 if(FAILED(hres))
788 break;
789
790 hres = jsdisp_propput_name(array, L"input", jsval_string(jsstr));
791 break;
792 }
793
794 free(match_result);
795
796 if(SUCCEEDED(hres) && r)
797 *r = jsval_obj(array);
798 else
800 return hres;
801}
802
804{
805 jsstr_t *ret;
806
807 ret = jsstr_substr(ctx->last_match, ctx->match_parens[idx].index, ctx->match_parens[idx].length);
808 if(!ret)
809 return E_OUTOFMEMORY;
810
811 *r = jsval_string(ret);
812 return S_OK;
813}
814
816{
817 TRACE("\n");
818 return global_idx(ctx, 0, r);
819}
820
822{
823 TRACE("\n");
824 return global_idx(ctx, 1, r);
825}
826
828{
829 TRACE("\n");
830 return global_idx(ctx, 2, r);
831}
832
834{
835 TRACE("\n");
836 return global_idx(ctx, 3, r);
837}
838
840{
841 TRACE("\n");
842 return global_idx(ctx, 4, r);
843}
844
846{
847 TRACE("\n");
848 return global_idx(ctx, 5, r);
849}
850
852{
853 TRACE("\n");
854 return global_idx(ctx, 6, r);
855}
856
858{
859 TRACE("\n");
860 return global_idx(ctx, 7, r);
861}
862
864{
865 TRACE("\n");
866 return global_idx(ctx, 8, r);
867}
868
870{
871 jsstr_t *ret;
872
873 TRACE("\n");
874
875 ret = jsstr_substr(ctx->last_match, 0, ctx->last_match_index);
876 if(!ret)
877 return E_OUTOFMEMORY;
878
879 *r = jsval_string(ret);
880 return S_OK;
881}
882
884{
885 jsstr_t *ret;
886
887 TRACE("\n");
888
889 ret = jsstr_substr(ctx->last_match, ctx->last_match_index+ctx->last_match_length,
890 jsstr_length(ctx->last_match) - ctx->last_match_index - ctx->last_match_length);
891 if(!ret)
892 return E_OUTOFMEMORY;
893
894 *r = jsval_string(ret);
895 return S_OK;
896}
897
899 jsval_t *r)
900{
901 TRACE("\n");
902
903 switch(flags) {
904 case DISPATCH_METHOD:
905 if(argc) {
906 if(is_object_instance(argv[0])) {
907 jsdisp_t *jsdisp = to_jsdisp(get_object(argv[0]));
908 if(jsdisp) {
909 if(is_class(jsdisp, JSCLASS_REGEXP)) {
910 if(argc > 1 && !is_undefined(argv[1]))
911 return JS_E_REGEXP_SYNTAX;
912
913 if(r)
914 *r = jsval_obj(jsdisp_addref(jsdisp));
915 return S_OK;
916 }
917 }
918 }
919 }
920 /* fall through */
921 case DISPATCH_CONSTRUCT: {
922 jsdisp_t *ret;
924
926 if(FAILED(hres))
927 return hres;
928
929 if(r)
930 *r = jsval_obj(ret);
931 else
933 return S_OK;
934 }
935 default:
936 FIXME("unimplemented flags: %x\n", flags);
937 return E_NOTIMPL;
938 }
939
940 return S_OK;
941}
942
955};
956
959 .call = Function_value,
960 .props_cnt = ARRAY_SIZE(RegExpConstr_props),
961 .props = RegExpConstr_props,
962};
963
965{
967 RegExpInstance *regexp;
969
970 hres = alloc_regexp(ctx, str, object_prototype, &regexp);
972 if(FAILED(hres))
973 return hres;
974
976 PROPF_CONSTR|2, &regexp->dispex, ret);
977
978 jsdisp_release(&regexp->dispex);
979 return hres;
980}
981
983{
984 const WCHAR *p;
985 DWORD flags = 0;
986
987 for (p = str; p < str+str_len; p++) {
988 switch (*p) {
989 case 'g':
990 flags |= REG_GLOB;
991 break;
992 case 'i':
993 flags |= REG_FOLD;
994 break;
995 case 'm':
997 break;
998 case 'y':
999 flags |= REG_STICKY;
1000 break;
1001 default:
1002 WARN("wrong flag %c\n", *p);
1003 return E_FAIL;
1004 }
1005 }
1006
1007 *ret = flags;
1008 return S_OK;
1009}
HRESULT create_array(script_ctx_t *ctx, DWORD length, jsdisp_t **ret)
Definition: array.c:1780
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define ARRAY_SIZE(A)
Definition: main.h:20
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define realloc
Definition: debug_ros.c:6
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
UINT op
Definition: effect.c:236
unsigned int idx
Definition: utils.c:41
HRESULT create_builtin_constructor(script_ctx_t *ctx, builtin_invoke_t value_proc, const WCHAR *name, const builtin_info_t *builtin_info, DWORD flags, jsdisp_t *prototype, jsdisp_t **ret)
Definition: function.c:809
HRESULT Function_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: function.c:600
#define REG_FOLD
Definition: regexp.h:36
#define REG_MULTILINE
Definition: regexp.h:38
#define REG_STICKY
Definition: regexp.h:39
#define REG_GLOB
Definition: regexp.h:37
static match_state_t * alloc_match_state(regexp_t *regexp, heap_pool_t *pool, const WCHAR *pos)
Definition: regexp.h:71
MonoAssembly int argc
Definition: metahost.c:107
_ACRTIMP double __cdecl floor(double)
Definition: floor.c:18
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
const GLdouble * v
Definition: gl.h:2040
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLdouble n
Definition: glext.h:7729
GLenum src
Definition: glext.h:6340
GLuint index
Definition: glext.h:6031
GLfloat f
Definition: glext.h:7540
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLbitfield flags
Definition: glext.h:7161
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
GLuint GLfloat * val
Definition: glext.h:7180
GLuint64EXT * result
Definition: glext.h:11304
GLfloat GLfloat p
Definition: glext.h:8902
GLenum GLsizei len
Definition: glext.h:6722
GLenum GLenum GLenum input
Definition: glext.h:9031
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
static HRESULT to_string(VARIANT *src, BSTR *dst)
Definition: host.c:46
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
HRESULT jsdisp_propput_name(jsdisp_t *obj, const WCHAR *name, jsval_t val)
Definition: dispex.c:2859
HRESULT init_dispex_from_constr(jsdisp_t *dispex, script_ctx_t *ctx, const builtin_info_t *builtin_info, jsdisp_t *constr)
Definition: dispex.c:2512
HRESULT gc_process_linked_val(struct gc_ctx *gc_ctx, enum gc_traverse_op op, jsdisp_t *obj, jsval_t *link)
Definition: dispex.c:1139
ULONG jsdisp_release(jsdisp_t *obj)
Definition: dispex.c:1911
HRESULT init_dispex(jsdisp_t *dispex, script_ctx_t *ctx, const builtin_info_t *builtin_info, jsdisp_t *prototype)
Definition: dispex.c:2454
HRESULT jsdisp_propput_idx(jsdisp_t *obj, DWORD idx, jsval_t val)
Definition: dispex.c:2864
jsdisp_t * jsdisp_addref(jsdisp_t *obj)
Definition: dispex.c:1902
HRESULT builtin_set_const(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t value)
Definition: dispex.c:741
jsdisp_t * to_jsdisp(IDispatch *disp)
Definition: dispex.c:2447
HRESULT regexp_execute(regexp_t *regexp, void *cx, heap_pool_t *pool, const WCHAR *str, DWORD str_len, match_state_t *result)
Definition: regexp.c:3136
regexp_t * regexp_new(void *cx, heap_pool_t *pool, const WCHAR *str, DWORD str_len, WORD flags, BOOL flat)
Definition: regexp.c:3191
void regexp_destroy(regexp_t *re)
Definition: regexp.c:3177
HRESULT to_flat_string(script_ctx_t *, jsval_t, jsstr_t **, const WCHAR **)
Definition: jsutils.c:846
#define REM_CHECK_GLOBAL
Definition: jscript.h:483
#define REM_NO_CTX_UPDATE
Definition: jscript.h:485
void heap_pool_clear(heap_pool_t *)
Definition: jsutils.c:141
#define REM_RESET_INDEX
Definition: jscript.h:484
heap_pool_t * heap_pool_mark(heap_pool_t *)
Definition: jsutils.c:177
#define SCRIPTLANGUAGEVERSION_ES5
Definition: jscript.h:53
#define JS_E_FUNCTION_EXPECTED
Definition: jscript.h:552
static BOOL is_int32(double d)
Definition: jscript.h:508
#define REM_NO_PARENS
Definition: jscript.h:487
static IDispatch * to_disp(jsdisp_t *jsdisp)
Definition: jscript.h:222
HRESULT to_number(script_ctx_t *, jsval_t, double *)
Definition: jsutils.c:630
#define REM_ALLOC_RESULT
Definition: jscript.h:486
@ JSCLASS_FUNCTION
Definition: jscript.h:109
@ JSCLASS_REGEXP
Definition: jscript.h:114
#define JS_E_REGEXP_SYNTAX
Definition: jscript.h:564
gc_traverse_op
Definition: jscript.h:161
#define JS_E_REGEXP_EXPECTED
Definition: jscript.h:563
static BOOL is_class(jsdisp_t *jsdisp, jsclass_t class)
Definition: jscript.h:503
const unsigned int PROPF_METHOD
Definition: jsdisp.idl:33
const unsigned int PROPF_CONSTR
Definition: jsdisp.idl:34
static HRESULT regexp_match(script_ctx_t *ctx, jsdisp_t *dispex, jsstr_t *jsstr, BOOL gflag, match_result_t **match_result, DWORD *result_cnt)
Definition: jsregexp.c:159
static HRESULT RegExp_toString(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: jsregexp.c:301
static const builtin_info_t RegExpInst_info
Definition: jsregexp.c:591
static HRESULT RegExp_gc_traverse(struct gc_ctx *gc_ctx, enum gc_traverse_op op, jsdisp_t *dispex)
Definition: jsregexp.c:558
static HRESULT RegExpConstr_get_idx1(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
Definition: jsregexp.c:815
static HRESULT RegExpConstr_get_idx4(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
Definition: jsregexp.c:833
static const builtin_prop_t RegExpConstr_props[]
Definition: jsregexp.c:943
HRESULT create_regexp_var(script_ctx_t *ctx, jsval_t src_arg, jsval_t *flags_arg, jsdisp_t **ret)
Definition: jsregexp.c:653
static RegExpInstance * regexp_this(jsval_t vthis)
Definition: jsregexp.c:42
HRESULT regexp_string_match(script_ctx_t *ctx, jsdisp_t *re, jsstr_t *jsstr, jsval_t *r)
Definition: jsregexp.c:701
static HRESULT RegExpConstr_get_idx2(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
Definition: jsregexp.c:821
static HRESULT RegExp_test(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: jsregexp.c:508
static HRESULT RegExpConstr_get_leftContext(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
Definition: jsregexp.c:869
static HRESULT RegExpConstr_get_idx8(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
Definition: jsregexp.c:857
static HRESULT global_idx(script_ctx_t *ctx, DWORD idx, jsval_t *r)
Definition: jsregexp.c:803
static HRESULT do_regexp_match_next(script_ctx_t *ctx, RegExpInstance *regexp, DWORD rem_flags, jsstr_t *jsstr, const WCHAR *str, match_state_t *ret)
Definition: jsregexp.c:55
static HRESULT RegExp_get_global(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
Definition: jsregexp.c:239
static RegExpInstance * regexp_from_jsdisp(jsdisp_t *jsdisp)
Definition: jsregexp.c:37
HRESULT create_regexp_constr(script_ctx_t *ctx, jsdisp_t *object_prototype, jsdisp_t **ret)
Definition: jsregexp.c:964
static const builtin_prop_t RegExp_props[]
Definition: jsregexp.c:563
static HRESULT RegExp_exec(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: jsregexp.c:472
static HRESULT alloc_regexp(script_ctx_t *ctx, jsstr_t *str, jsdisp_t *object_prototype, RegExpInstance **ret)
Definition: jsregexp.c:600
static HRESULT RegExpConstr_get_idx6(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
Definition: jsregexp.c:845
static HRESULT create_match_array(script_ctx_t *ctx, jsstr_t *input_str, const match_state_t *result, IDispatch **ret)
Definition: jsregexp.c:349
static HRESULT RegExpConstr_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: jsregexp.c:898
static HRESULT RegExp_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: jsregexp.c:532
static const builtin_info_t RegExpConstr_info
Definition: jsregexp.c:957
static HRESULT run_exec(script_ctx_t *ctx, jsval_t vthis, jsval_t arg, jsstr_t **input, match_state_t **result, BOOL *ret)
Definition: jsregexp.c:419
static HRESULT RegExpConstr_get_rightContext(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
Definition: jsregexp.c:883
static HRESULT RegExpConstr_get_idx9(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
Definition: jsregexp.c:863
HRESULT regexp_match_next(script_ctx_t *ctx, jsdisp_t *dispex, DWORD rem_flags, jsstr_t *jsstr, match_state_t **ret)
Definition: jsregexp.c:102
static HRESULT RegExp_set_lastIndex(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t value)
Definition: jsregexp.c:285
HRESULT create_regexp(script_ctx_t *ctx, jsstr_t *src, DWORD flags, jsdisp_t **ret)
Definition: jsregexp.c:626
static HRESULT RegExpConstr_get_idx5(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
Definition: jsregexp.c:839
static INT index_from_val(script_ctx_t *ctx, jsval_t v)
Definition: jsregexp.c:263
static HRESULT RegExp_get_source(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
Definition: jsregexp.c:231
static void set_last_index(RegExpInstance *This, DWORD last_index)
Definition: jsregexp.c:48
static HRESULT RegExpConstr_get_idx7(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
Definition: jsregexp.c:851
static HRESULT RegExp_get_lastIndex(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
Definition: jsregexp.c:276
static HRESULT RegExp_get_multiline(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
Definition: jsregexp.c:255
static void RegExp_destructor(jsdisp_t *dispex)
Definition: jsregexp.c:548
static const builtin_info_t RegExp_info
Definition: jsregexp.c:574
static HRESULT RegExp_get_ignoreCase(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
Definition: jsregexp.c:247
static const builtin_prop_t RegExpInst_props[]
Definition: jsregexp.c:583
static HRESULT RegExpConstr_get_idx3(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
Definition: jsregexp.c:827
HRESULT parse_regexp_flags(const WCHAR *str, DWORD str_len, DWORD *ret)
Definition: jsregexp.c:982
jsstr_t * jsstr_alloc_len(const WCHAR *buf, unsigned len)
Definition: jsstr.c:86
jsstr_t * jsstr_undefined(void)
Definition: jsstr.c:296
jsstr_t * jsstr_empty(void)
Definition: jsstr.c:291
jsstr_t * jsstr_alloc_buf(unsigned len, WCHAR **buf)
Definition: jsstr.c:69
static jsstr_t * jsstr_substr(jsstr_t *str, unsigned off, unsigned len)
Definition: jsstr.h:160
static jsstr_t * jsstr_addref(jsstr_t *str)
Definition: jsstr.h:113
static const WCHAR * jsstr_flatten(jsstr_t *str)
Definition: jsstr.h:136
static void jsstr_release(jsstr_t *str)
Definition: jsstr.h:107
static unsigned jsstr_length(jsstr_t *str)
Definition: jsstr.h:55
static unsigned jsstr_flush(jsstr_t *str, WCHAR *buf)
Definition: jsstr.h:145
HRESULT jsval_copy(jsval_t v, jsval_t *r)
Definition: jsutils.c:225
void jsval_release(jsval_t val)
Definition: jsutils.c:186
static jsval_t jsval_null(void)
Definition: jsval.h:130
static jsval_t jsval_string(jsstr_t *str)
Definition: jsval.h:109
static jsval_t jsval_undefined(void)
Definition: jsval.h:146
static jsval_t jsval_obj(jsdisp_t *obj)
Definition: jsval.h:125
static jsval_t jsval_bool(BOOL b)
Definition: jsval.h:101
static BOOL is_undefined(jsval_t v)
Definition: jsval.h:180
static jsval_t jsval_disp(IDispatch *obj)
Definition: jsval.h:117
static IDispatch * get_object(jsval_t v)
Definition: jsval.h:228
static BOOL is_object_instance(jsval_t v)
Definition: jsval.h:175
static jsval_t jsval_number(double n)
Definition: jsval.h:153
#define f
Definition: ke_i.h:83
#define b
Definition: ke_i.h:79
#define debugstr_wn
Definition: kernel32.h:33
char string[160]
Definition: util.h:11
static PVOID ptr
Definition: dispmode.c:27
HRESULT hres
Definition: protocol.c:465
static void ULONG ULONG * ret_size
Definition: time.c:40
#define min(a, b)
Definition: monoChain.cc:55
#define argv
Definition: mplay32.c:18
#define DISPATCH_METHOD
Definition: oleauto.h:1006
short WCHAR
Definition: pedump.c:58
#define calloc
Definition: rosglue.h:14
const WCHAR * str
#define memset(x, y, z)
Definition: compat.h:39
#define TRACE(s)
Definition: solgame.cpp:4
jsstr_t * str
Definition: jsregexp.c:32
jsdisp_t dispex
Definition: jsregexp.c:29
jsval_t last_index_val
Definition: jsregexp.c:34
INT last_index
Definition: jsregexp.c:33
regexp_t * jsregexp
Definition: jsregexp.c:31
Definition: jsstr.h:36
Definition: jsval.h:54
Definition: undname.c:54
jsclass_t class
Definition: jscript.h:183
Definition: dispex.c:889
Definition: match.c:28
WORD flags
Definition: regexp.h:57
#define str_len
Definition: treelist.c:89
int32_t INT
Definition: typedefs.h:58
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
Definition: pdh_main.c:96
#define S_FALSE
Definition: winerror.h:3451
#define DISP_E_EXCEPTION
Definition: winerror.h:3621