ReactOS 0.4.17-dev-357-ga8f14ff
jsregexp.c File Reference
#include <math.h>
#include "jscript.h"
#include "regexp.h"
#include "wine/debug.h"
Include dependency graph for jsregexp.c:

Go to the source code of this file.

Classes

struct  RegExpInstance
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (jscript)
 
static RegExpInstanceregexp_from_jsdisp (jsdisp_t *jsdisp)
 
static RegExpInstanceregexp_this (jsval_t vthis)
 
static void set_last_index (RegExpInstance *This, DWORD last_index)
 
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)
 
HRESULT regexp_match_next (script_ctx_t *ctx, jsdisp_t *dispex, DWORD rem_flags, jsstr_t *jsstr, match_state_t **ret)
 
static HRESULT regexp_match (script_ctx_t *ctx, jsdisp_t *dispex, jsstr_t *jsstr, BOOL gflag, match_result_t **match_result, DWORD *result_cnt)
 
static HRESULT RegExp_get_source (script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
 
static HRESULT RegExp_get_global (script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
 
static HRESULT RegExp_get_ignoreCase (script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
 
static HRESULT RegExp_get_multiline (script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
 
static INT index_from_val (script_ctx_t *ctx, jsval_t v)
 
static HRESULT RegExp_get_lastIndex (script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
 
static HRESULT RegExp_set_lastIndex (script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t value)
 
static HRESULT RegExp_toString (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
static HRESULT create_match_array (script_ctx_t *ctx, jsstr_t *input_str, const match_state_t *result, IDispatch **ret)
 
static HRESULT run_exec (script_ctx_t *ctx, jsval_t vthis, jsval_t arg, jsstr_t **input, match_state_t **result, BOOL *ret)
 
static HRESULT RegExp_exec (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
static HRESULT RegExp_test (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
static HRESULT RegExp_value (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
static void RegExp_destructor (jsdisp_t *dispex)
 
static HRESULT RegExp_gc_traverse (struct gc_ctx *gc_ctx, enum gc_traverse_op op, jsdisp_t *dispex)
 
static HRESULT alloc_regexp (script_ctx_t *ctx, jsstr_t *str, jsdisp_t *object_prototype, RegExpInstance **ret)
 
HRESULT create_regexp (script_ctx_t *ctx, jsstr_t *src, DWORD flags, jsdisp_t **ret)
 
HRESULT create_regexp_var (script_ctx_t *ctx, jsval_t src_arg, jsval_t *flags_arg, jsdisp_t **ret)
 
HRESULT regexp_string_match (script_ctx_t *ctx, jsdisp_t *re, jsstr_t *jsstr, jsval_t *r)
 
static HRESULT global_idx (script_ctx_t *ctx, DWORD idx, jsval_t *r)
 
static HRESULT RegExpConstr_get_idx1 (script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
 
static HRESULT RegExpConstr_get_idx2 (script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
 
static HRESULT RegExpConstr_get_idx3 (script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
 
static HRESULT RegExpConstr_get_idx4 (script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
 
static HRESULT RegExpConstr_get_idx5 (script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
 
static HRESULT RegExpConstr_get_idx6 (script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
 
static HRESULT RegExpConstr_get_idx7 (script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
 
static HRESULT RegExpConstr_get_idx8 (script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
 
static HRESULT RegExpConstr_get_idx9 (script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
 
static HRESULT RegExpConstr_get_leftContext (script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
 
static HRESULT RegExpConstr_get_rightContext (script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
 
static HRESULT RegExpConstr_value (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
HRESULT create_regexp_constr (script_ctx_t *ctx, jsdisp_t *object_prototype, jsdisp_t **ret)
 
HRESULT parse_regexp_flags (const WCHAR *str, DWORD str_len, DWORD *ret)
 

Variables

static const builtin_prop_t RegExp_props []
 
static const builtin_info_t RegExp_info
 
static const builtin_prop_t RegExpInst_props []
 
static const builtin_info_t RegExpInst_info
 
static const builtin_prop_t RegExpConstr_props []
 
static const builtin_info_t RegExpConstr_info
 

Function Documentation

◆ alloc_regexp()

static HRESULT alloc_regexp ( script_ctx_t ctx,
jsstr_t str,
jsdisp_t object_prototype,
RegExpInstance **  ret 
)
static

Definition at line 600 of file jsregexp.c.

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}
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define free
Definition: debug_ros.c:5
return ret
Definition: mutex.c:146
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
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 init_dispex(jsdisp_t *dispex, script_ctx_t *ctx, const builtin_info_t *builtin_info, jsdisp_t *prototype)
Definition: dispex.c:2454
static const builtin_info_t RegExpInst_info
Definition: jsregexp.c:591
static const builtin_info_t RegExp_info
Definition: jsregexp.c:574
static jsstr_t * jsstr_addref(jsstr_t *str)
Definition: jsstr.h:113
static jsval_t jsval_number(double n)
Definition: jsval.h:153
HRESULT hres
Definition: protocol.c:465
#define calloc
Definition: rosglue.h:14
const WCHAR * str
jsstr_t * str
Definition: jsregexp.c:32
jsdisp_t dispex
Definition: jsregexp.c:29
jsval_t last_index_val
Definition: jsregexp.c:34

Referenced by create_regexp(), and create_regexp_constr().

◆ create_match_array()

static HRESULT create_match_array ( script_ctx_t ctx,
jsstr_t input_str,
const match_state_t result,
IDispatch **  ret 
)
static

Definition at line 349 of file jsregexp.c.

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}
HRESULT create_array(script_ctx_t *ctx, DWORD length, jsdisp_t **ret)
Definition: array.c:1780
#define L(x)
Definition: resources.c:13
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint GLfloat * val
Definition: glext.h:7180
GLuint64EXT * result
Definition: glext.h:11304
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
#define SUCCEEDED(hr)
Definition: intsafe.h:50
HRESULT jsdisp_propput_name(jsdisp_t *obj, const WCHAR *name, jsval_t val)
Definition: dispex.c:2859
ULONG jsdisp_release(jsdisp_t *obj)
Definition: dispex.c:1911
HRESULT jsdisp_propput_idx(jsdisp_t *obj, DWORD idx, jsval_t val)
Definition: dispex.c:2864
#define SCRIPTLANGUAGEVERSION_ES5
Definition: jscript.h:53
static IDispatch * to_disp(jsdisp_t *jsdisp)
Definition: jscript.h:222
jsstr_t * jsstr_alloc_len(const WCHAR *buf, unsigned len)
Definition: jsstr.c:86
jsstr_t * jsstr_empty(void)
Definition: jsstr.c:291
static jsstr_t * jsstr_substr(jsstr_t *str, unsigned off, unsigned len)
Definition: jsstr.h:160
static const WCHAR * jsstr_flatten(jsstr_t *str)
Definition: jsstr.h:136
static void jsstr_release(jsstr_t *str)
Definition: jsstr.h:107
void jsval_release(jsval_t val)
Definition: jsutils.c:186
static jsval_t jsval_string(jsstr_t *str)
Definition: jsval.h:109
static jsval_t jsval_undefined(void)
Definition: jsval.h:146
short WCHAR
Definition: pedump.c:58
Definition: jsstr.h:36
Definition: jsval.h:54
Definition: undname.c:54

Referenced by RegExp_exec(), and regexp_string_match().

◆ create_regexp()

HRESULT create_regexp ( script_ctx_t ctx,
jsstr_t src,
DWORD  flags,
jsdisp_t **  ret 
)

Definition at line 626 of file jsregexp.c.

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}
#define WARN(fmt,...)
Definition: precomp.h:61
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
GLenum src
Definition: glext.h:6340
GLbitfield flags
Definition: glext.h:7161
regexp_t * regexp_new(void *cx, heap_pool_t *pool, const WCHAR *str, DWORD str_len, WORD flags, BOOL flat)
Definition: regexp.c:3191
static HRESULT alloc_regexp(script_ctx_t *ctx, jsstr_t *str, jsdisp_t *object_prototype, RegExpInstance **ret)
Definition: jsregexp.c:600
static unsigned jsstr_length(jsstr_t *str)
Definition: jsstr.h:55
#define debugstr_wn
Definition: kernel32.h:33
#define TRACE(s)
Definition: solgame.cpp:4
regexp_t * jsregexp
Definition: jsregexp.c:31
#define DISP_E_EXCEPTION
Definition: winerror.h:3621

Referenced by create_regexp_var(), interp_new(), interp_regexp(), and String_match().

◆ create_regexp_constr()

HRESULT create_regexp_constr ( script_ctx_t ctx,
jsdisp_t object_prototype,
jsdisp_t **  ret 
)

Definition at line 964 of file jsregexp.c.

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}
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
const unsigned int PROPF_CONSTR
Definition: jsdisp.idl:34
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 const builtin_info_t RegExpConstr_info
Definition: jsregexp.c:957

Referenced by init_constructors().

◆ create_regexp_var()

HRESULT create_regexp_var ( script_ctx_t ctx,
jsval_t  src_arg,
jsval_t flags_arg,
jsdisp_t **  ret 
)

Definition at line 653 of file jsregexp.c.

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}
static HRESULT to_string(VARIANT *src, BSTR *dst)
Definition: host.c:46
jsdisp_t * to_jsdisp(IDispatch *disp)
Definition: dispex.c:2447
@ JSCLASS_REGEXP
Definition: jscript.h:114
static BOOL is_class(jsdisp_t *jsdisp, jsclass_t class)
Definition: jscript.h:503
static RegExpInstance * regexp_from_jsdisp(jsdisp_t *jsdisp)
Definition: jsregexp.c:37
HRESULT create_regexp(script_ctx_t *ctx, jsstr_t *src, DWORD flags, jsdisp_t **ret)
Definition: jsregexp.c:626
HRESULT parse_regexp_flags(const WCHAR *str, DWORD str_len, DWORD *ret)
Definition: jsregexp.c:982
static BOOL is_undefined(jsval_t v)
Definition: jsval.h:180
static IDispatch * get_object(jsval_t v)
Definition: jsval.h:228
static BOOL is_object_instance(jsval_t v)
Definition: jsval.h:175
WORD flags
Definition: regexp.h:57

Referenced by RegExpConstr_value(), and String_search().

◆ do_regexp_match_next()

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 
)
static

Definition at line 55 of file jsregexp.c.

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}
#define ARRAY_SIZE(A)
Definition: main.h:20
GLdouble n
Definition: glext.h:7729
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
#define REM_NO_CTX_UPDATE
Definition: jscript.h:485
#define REM_RESET_INDEX
Definition: jscript.h:484
static void set_last_index(RegExpInstance *This, DWORD last_index)
Definition: jsregexp.c:48
#define min(a, b)
Definition: monoChain.cc:55
#define memset(x, y, z)
Definition: compat.h:39
#define S_FALSE
Definition: winerror.h:3451

Referenced by regexp_match(), and regexp_match_next().

◆ global_idx()

static HRESULT global_idx ( script_ctx_t ctx,
DWORD  idx,
jsval_t r 
)
static

Definition at line 803 of file jsregexp.c.

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}
unsigned int idx
Definition: utils.c:41
GLdouble GLdouble GLdouble r
Definition: gl.h:2055

Referenced by RegExpConstr_get_idx1(), RegExpConstr_get_idx2(), RegExpConstr_get_idx3(), RegExpConstr_get_idx4(), RegExpConstr_get_idx5(), RegExpConstr_get_idx6(), RegExpConstr_get_idx7(), RegExpConstr_get_idx8(), and RegExpConstr_get_idx9().

◆ index_from_val()

static INT index_from_val ( script_ctx_t ctx,
jsval_t  v 
)
static

Definition at line 263 of file jsregexp.c.

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}
_ACRTIMP double __cdecl floor(double)
Definition: floor.c:18
const GLdouble * v
Definition: gl.h:2040
static BOOL is_int32(double d)
Definition: jscript.h:508
HRESULT to_number(script_ctx_t *, jsval_t, double *)
Definition: jsutils.c:630

Referenced by RegExp_set_lastIndex().

◆ parse_regexp_flags()

HRESULT parse_regexp_flags ( const WCHAR str,
DWORD  str_len,
DWORD ret 
)

Definition at line 982 of file jsregexp.c.

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}
#define E_FAIL
Definition: ddrawi.h:102
#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
GLfloat GLfloat p
Definition: glext.h:8902
#define str_len
Definition: treelist.c:89

Referenced by create_regexp_var(), and parse_regexp().

◆ RegExp_destructor()

static void RegExp_destructor ( jsdisp_t dispex)
static

Definition at line 548 of file jsregexp.c.

549{
551
552 if(This->jsregexp)
553 regexp_destroy(This->jsregexp);
554 jsval_release(This->last_index_val);
555 jsstr_release(This->str);
556}
void regexp_destroy(regexp_t *re)
Definition: regexp.c:3177

◆ RegExp_exec()

static HRESULT RegExp_exec ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 472 of file jsregexp.c.

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}
MonoAssembly int argc
Definition: metahost.c:107
unsigned int BOOL
Definition: ntddk_ex.h:94
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
void heap_pool_clear(heap_pool_t *)
Definition: jsutils.c:141
heap_pool_t * heap_pool_mark(heap_pool_t *)
Definition: jsutils.c:177
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 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 jsval_t jsval_null(void)
Definition: jsval.h:130
static jsval_t jsval_disp(IDispatch *obj)
Definition: jsval.h:117
#define b
Definition: ke_i.h:79
char string[160]
Definition: util.h:11
#define argv
Definition: mplay32.c:18
Definition: match.c:28

◆ regexp_from_jsdisp()

◆ RegExp_gc_traverse()

static HRESULT RegExp_gc_traverse ( struct gc_ctx gc_ctx,
enum gc_traverse_op  op,
jsdisp_t dispex 
)
static

Definition at line 558 of file jsregexp.c.

559{
560 return gc_process_linked_val(gc_ctx, op, dispex, &regexp_from_jsdisp(dispex)->last_index_val);
561}
UINT op
Definition: effect.c:236
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
Definition: dispex.c:889

◆ RegExp_get_global()

static HRESULT RegExp_get_global ( script_ctx_t ctx,
jsdisp_t jsthis,
jsval_t r 
)
static

Definition at line 239 of file jsregexp.c.

240{
241 TRACE("\n");
242
243 *r = jsval_bool(!!(regexp_from_jsdisp(jsthis)->jsregexp->flags & REG_GLOB));
244 return S_OK;
245}
static jsval_t jsval_bool(BOOL b)
Definition: jsval.h:101

◆ RegExp_get_ignoreCase()

static HRESULT RegExp_get_ignoreCase ( script_ctx_t ctx,
jsdisp_t jsthis,
jsval_t r 
)
static

Definition at line 247 of file jsregexp.c.

248{
249 TRACE("\n");
250
251 *r = jsval_bool(!!(regexp_from_jsdisp(jsthis)->jsregexp->flags & REG_FOLD));
252 return S_OK;
253}

◆ RegExp_get_lastIndex()

static HRESULT RegExp_get_lastIndex ( script_ctx_t ctx,
jsdisp_t jsthis,
jsval_t r 
)
static

Definition at line 276 of file jsregexp.c.

277{
278 RegExpInstance *regexp = regexp_from_jsdisp(jsthis);
279
280 TRACE("\n");
281
282 return jsval_copy(regexp->last_index_val, r);
283}
HRESULT jsval_copy(jsval_t v, jsval_t *r)
Definition: jsutils.c:225

◆ RegExp_get_multiline()

static HRESULT RegExp_get_multiline ( script_ctx_t ctx,
jsdisp_t jsthis,
jsval_t r 
)
static

Definition at line 255 of file jsregexp.c.

256{
257 TRACE("\n");
258
259 *r = jsval_bool(!!(regexp_from_jsdisp(jsthis)->jsregexp->flags & REG_MULTILINE));
260 return S_OK;
261}

◆ RegExp_get_source()

static HRESULT RegExp_get_source ( script_ctx_t ctx,
jsdisp_t jsthis,
jsval_t r 
)
static

Definition at line 231 of file jsregexp.c.

232{
233 TRACE("\n");
234
236 return S_OK;
237}

◆ regexp_match()

static HRESULT regexp_match ( script_ctx_t ctx,
jsdisp_t dispex,
jsstr_t jsstr,
BOOL  gflag,
match_result_t **  match_result,
DWORD result_cnt 
)
static

Definition at line 159 of file jsregexp.c.

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}
#define realloc
Definition: debug_ros.c:6
#define malloc
Definition: debug_ros.c:4
static match_state_t * alloc_match_state(regexp_t *regexp, heap_pool_t *pool, const WCHAR *pos)
Definition: regexp.h:71
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 void ULONG ULONG * ret_size
Definition: time.c:40

Referenced by regexp_string_match().

◆ regexp_match_next()

HRESULT regexp_match_next ( script_ctx_t ctx,
jsdisp_t dispex,
DWORD  rem_flags,
jsstr_t jsstr,
match_state_t **  ret 
)

Definition at line 102 of file jsregexp.c.

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}
#define REM_CHECK_GLOBAL
Definition: jscript.h:483
#define REM_NO_PARENS
Definition: jscript.h:487
#define REM_ALLOC_RESULT
Definition: jscript.h:486

Referenced by regexp_string_match(), run_exec(), String_replace(), String_search(), and String_split().

◆ RegExp_set_lastIndex()

static HRESULT RegExp_set_lastIndex ( script_ctx_t ctx,
jsdisp_t jsthis,
jsval_t  value 
)
static

Definition at line 285 of file jsregexp.c.

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}
static INT index_from_val(script_ctx_t *ctx, jsval_t v)
Definition: jsregexp.c:263
INT last_index
Definition: jsregexp.c:33
Definition: pdh_main.c:96

◆ regexp_string_match()

HRESULT regexp_string_match ( script_ctx_t ctx,
jsdisp_t re,
jsstr_t jsstr,
jsval_t r 
)

Definition at line 701 of file jsregexp.c.

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}
GLuint index
Definition: glext.h:6031
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
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
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 jsval_t jsval_obj(jsdisp_t *obj)
Definition: jsval.h:125

Referenced by String_match().

◆ RegExp_test()

static HRESULT RegExp_test ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 508 of file jsregexp.c.

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}
jsstr_t * jsstr_undefined(void)
Definition: jsstr.c:296

◆ regexp_this()

static RegExpInstance * regexp_this ( jsval_t  vthis)
inlinestatic

Definition at line 42 of file jsregexp.c.

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}

Referenced by RegExp_toString(), and run_exec().

◆ RegExp_toString()

static HRESULT RegExp_toString ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 301 of file jsregexp.c.

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}
GLfloat f
Definition: glext.h:7540
GLenum GLsizei len
Definition: glext.h:6722
#define JS_E_REGEXP_EXPECTED
Definition: jscript.h:563
static RegExpInstance * regexp_this(jsval_t vthis)
Definition: jsregexp.c:42
jsstr_t * jsstr_alloc_buf(unsigned len, WCHAR **buf)
Definition: jsstr.c:69
static unsigned jsstr_flush(jsstr_t *str, WCHAR *buf)
Definition: jsstr.h:145
#define f
Definition: ke_i.h:83
static PVOID ptr
Definition: dispmode.c:27

◆ RegExp_value()

static HRESULT RegExp_value ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 532 of file jsregexp.c.

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}
#define FIXME(fmt,...)
Definition: precomp.h:53
#define E_NOTIMPL
Definition: ddrawi.h:99
#define JS_E_FUNCTION_EXPECTED
Definition: jscript.h:552

◆ RegExpConstr_get_idx1()

static HRESULT RegExpConstr_get_idx1 ( script_ctx_t ctx,
jsdisp_t jsthis,
jsval_t r 
)
static

Definition at line 815 of file jsregexp.c.

816{
817 TRACE("\n");
818 return global_idx(ctx, 0, r);
819}
static HRESULT global_idx(script_ctx_t *ctx, DWORD idx, jsval_t *r)
Definition: jsregexp.c:803

◆ RegExpConstr_get_idx2()

static HRESULT RegExpConstr_get_idx2 ( script_ctx_t ctx,
jsdisp_t jsthis,
jsval_t r 
)
static

Definition at line 821 of file jsregexp.c.

822{
823 TRACE("\n");
824 return global_idx(ctx, 1, r);
825}

◆ RegExpConstr_get_idx3()

static HRESULT RegExpConstr_get_idx3 ( script_ctx_t ctx,
jsdisp_t jsthis,
jsval_t r 
)
static

Definition at line 827 of file jsregexp.c.

828{
829 TRACE("\n");
830 return global_idx(ctx, 2, r);
831}

◆ RegExpConstr_get_idx4()

static HRESULT RegExpConstr_get_idx4 ( script_ctx_t ctx,
jsdisp_t jsthis,
jsval_t r 
)
static

Definition at line 833 of file jsregexp.c.

834{
835 TRACE("\n");
836 return global_idx(ctx, 3, r);
837}

◆ RegExpConstr_get_idx5()

static HRESULT RegExpConstr_get_idx5 ( script_ctx_t ctx,
jsdisp_t jsthis,
jsval_t r 
)
static

Definition at line 839 of file jsregexp.c.

840{
841 TRACE("\n");
842 return global_idx(ctx, 4, r);
843}

◆ RegExpConstr_get_idx6()

static HRESULT RegExpConstr_get_idx6 ( script_ctx_t ctx,
jsdisp_t jsthis,
jsval_t r 
)
static

Definition at line 845 of file jsregexp.c.

846{
847 TRACE("\n");
848 return global_idx(ctx, 5, r);
849}

◆ RegExpConstr_get_idx7()

static HRESULT RegExpConstr_get_idx7 ( script_ctx_t ctx,
jsdisp_t jsthis,
jsval_t r 
)
static

Definition at line 851 of file jsregexp.c.

852{
853 TRACE("\n");
854 return global_idx(ctx, 6, r);
855}

◆ RegExpConstr_get_idx8()

static HRESULT RegExpConstr_get_idx8 ( script_ctx_t ctx,
jsdisp_t jsthis,
jsval_t r 
)
static

Definition at line 857 of file jsregexp.c.

858{
859 TRACE("\n");
860 return global_idx(ctx, 7, r);
861}

◆ RegExpConstr_get_idx9()

static HRESULT RegExpConstr_get_idx9 ( script_ctx_t ctx,
jsdisp_t jsthis,
jsval_t r 
)
static

Definition at line 863 of file jsregexp.c.

864{
865 TRACE("\n");
866 return global_idx(ctx, 8, r);
867}

◆ RegExpConstr_get_leftContext()

static HRESULT RegExpConstr_get_leftContext ( script_ctx_t ctx,
jsdisp_t jsthis,
jsval_t r 
)
static

Definition at line 869 of file jsregexp.c.

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}

◆ RegExpConstr_get_rightContext()

static HRESULT RegExpConstr_get_rightContext ( script_ctx_t ctx,
jsdisp_t jsthis,
jsval_t r 
)
static

Definition at line 883 of file jsregexp.c.

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}

◆ RegExpConstr_value()

static HRESULT RegExpConstr_value ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 898 of file jsregexp.c.

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}
jsdisp_t * jsdisp_addref(jsdisp_t *obj)
Definition: dispex.c:1902
#define JS_E_REGEXP_SYNTAX
Definition: jscript.h:564
HRESULT create_regexp_var(script_ctx_t *ctx, jsval_t src_arg, jsval_t *flags_arg, jsdisp_t **ret)
Definition: jsregexp.c:653
#define DISPATCH_METHOD
Definition: oleauto.h:1006

Referenced by create_regexp_constr().

◆ run_exec()

static HRESULT run_exec ( script_ctx_t ctx,
jsval_t  vthis,
jsval_t  arg,
jsstr_t **  input,
match_state_t **  result,
BOOL ret 
)
static

Definition at line 419 of file jsregexp.c.

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}
HRESULT to_flat_string(script_ctx_t *, jsval_t, jsstr_t **, const WCHAR **)
Definition: jsutils.c:846

Referenced by RegExp_exec(), and RegExp_test().

◆ set_last_index()

static void set_last_index ( RegExpInstance This,
DWORD  last_index 
)
static

Definition at line 48 of file jsregexp.c.

49{
50 This->last_index = last_index;
51 jsval_release(This->last_index_val);
52 This->last_index_val = jsval_number(last_index);
53}

Referenced by do_regexp_match_next(), and run_exec().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( jscript  )

Variable Documentation

◆ RegExp_info

const builtin_info_t RegExp_info
static
Initial value:
= {
.class = JSCLASS_REGEXP,
.call = RegExp_value,
.props_cnt = ARRAY_SIZE(RegExp_props),
.props = RegExp_props,
.destructor = RegExp_destructor,
.gc_traverse = RegExp_gc_traverse
}
static HRESULT RegExp_gc_traverse(struct gc_ctx *gc_ctx, enum gc_traverse_op op, jsdisp_t *dispex)
Definition: jsregexp.c:558
static const builtin_prop_t RegExp_props[]
Definition: jsregexp.c:563
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 void RegExp_destructor(jsdisp_t *dispex)
Definition: jsregexp.c:548

Definition at line 574 of file jsregexp.c.

Referenced by alloc_regexp().

◆ RegExp_props

const builtin_prop_t RegExp_props[]
static
Initial value:
= {
{L"exec", RegExp_exec, PROPF_METHOD|1},
{L"global", NULL,0, RegExp_get_global},
{L"ignoreCase", NULL,0, RegExp_get_ignoreCase},
{L"multiline", NULL,0, RegExp_get_multiline},
{L"source", NULL,0, RegExp_get_source},
{L"test", RegExp_test, PROPF_METHOD|1},
}
const unsigned int PROPF_METHOD
Definition: jsdisp.idl:33
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 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 RegExp_get_global(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
Definition: jsregexp.c:239
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 RegExp_set_lastIndex(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t value)
Definition: jsregexp.c:285
static HRESULT RegExp_get_source(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
Definition: jsregexp.c:231
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 HRESULT RegExp_get_ignoreCase(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
Definition: jsregexp.c:247

Definition at line 563 of file jsregexp.c.

◆ RegExpConstr_info

const builtin_info_t RegExpConstr_info
static
Initial value:
= {
.class = JSCLASS_FUNCTION,
.call = Function_value,
}
HRESULT Function_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: function.c:600
@ JSCLASS_FUNCTION
Definition: jscript.h:109
static const builtin_prop_t RegExpConstr_props[]
Definition: jsregexp.c:943

Definition at line 957 of file jsregexp.c.

Referenced by create_regexp_constr().

◆ RegExpConstr_props

const builtin_prop_t RegExpConstr_props[]
static
Initial value:
= {
}
HRESULT builtin_set_const(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t value)
Definition: dispex.c:741
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 HRESULT RegExpConstr_get_idx2(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
Definition: jsregexp.c:821
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 RegExpConstr_get_idx6(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
Definition: jsregexp.c:845
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
static HRESULT RegExpConstr_get_idx5(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
Definition: jsregexp.c:839
static HRESULT RegExpConstr_get_idx7(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
Definition: jsregexp.c:851
static HRESULT RegExpConstr_get_idx3(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
Definition: jsregexp.c:827

Definition at line 943 of file jsregexp.c.

◆ RegExpInst_info

const builtin_info_t RegExpInst_info
static
Initial value:
= {
.class = JSCLASS_REGEXP,
.call = RegExp_value,
.props = RegExpInst_props,
.destructor = RegExp_destructor,
.gc_traverse = RegExp_gc_traverse
}
static const builtin_prop_t RegExpInst_props[]
Definition: jsregexp.c:583

Definition at line 591 of file jsregexp.c.

Referenced by alloc_regexp().

◆ RegExpInst_props

const builtin_prop_t RegExpInst_props[]
static
Initial value:
= {
{L"global", NULL,0, RegExp_get_global},
{L"ignoreCase", NULL,0, RegExp_get_ignoreCase},
{L"multiline", NULL,0, RegExp_get_multiline},
{L"source", NULL,0, RegExp_get_source}
}

Definition at line 583 of file jsregexp.c.