xref: /reactos/dll/win32/jscript/regexp.h (revision c2c66aff)
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 #pragma once
20 
21 /*
22  * Code in this file is based on files:
23  * js/src/jsregexp.h
24  * js/src/jsregexp.c
25  * from Mozilla project, released under LGPL 2.1 or later.
26  *
27  * The Original Code is Mozilla Communicator client code, released
28  * March 31, 1998.
29  *
30  * The Initial Developer of the Original Code is
31  * Netscape Communications Corporation.
32  * Portions created by the Initial Developer are Copyright (C) 1998
33  * the Initial Developer. All Rights Reserved.
34  */
35 
36 #define REG_FOLD      0x01      /* fold uppercase to lowercase */
37 #define REG_GLOB      0x02      /* global exec, creates array of matches */
38 #define REG_MULTILINE 0x04      /* treat ^ and $ as begin and end of line */
39 #define REG_STICKY    0x08      /* only match starting at lastIndex */
40 
41 typedef struct RECapture {
42     ptrdiff_t index;            /* start of contents, -1 for empty  */
43     size_t length;              /* length of capture */
44 } RECapture;
45 
46 typedef struct match_state_t {
47     const WCHAR *cp;
48     DWORD match_len;
49 
50     DWORD paren_count;
51     RECapture parens[1];
52 } match_state_t;
53 
54 typedef BYTE jsbytecode;
55 
56 typedef struct regexp_t {
57     WORD                flags;         /* flags, see jsapi.h's REG_* defines */
58     size_t              parenCount;    /* number of parenthesized submatches */
59     size_t              classCount;    /* count [...] bitmaps */
60     struct RECharSet    *classList;    /* list of [...] bitmaps */
61     const WCHAR         *source;       /* locked source string, sans // */
62     DWORD               source_len;
63     jsbytecode          program[1];    /* regular expression bytecode */
64 } regexp_t;
65 
66 regexp_t* regexp_new(void*, heap_pool_t*, const WCHAR*, DWORD, WORD, BOOL) DECLSPEC_HIDDEN;
67 void regexp_destroy(regexp_t*) DECLSPEC_HIDDEN;
68 HRESULT regexp_execute(regexp_t*, void*, heap_pool_t*, const WCHAR*,
69         DWORD, match_state_t*) DECLSPEC_HIDDEN;
70 
alloc_match_state(regexp_t * regexp,heap_pool_t * pool,const WCHAR * pos)71 static inline match_state_t* alloc_match_state(regexp_t *regexp,
72         heap_pool_t *pool, const WCHAR *pos)
73 {
74     size_t size = offsetof(match_state_t, parens) + regexp->parenCount*sizeof(RECapture);
75     match_state_t *ret;
76 
77     ret = pool ? heap_pool_alloc(pool, size) : heap_alloc(size);
78     if(!ret)
79         return NULL;
80 
81     ret->cp = pos;
82     return ret;
83 }
84