[PSAPI_WINETEST] Sync with Wine Staging 2.16. CORE-13762
[reactos.git] / dll / win32 / jscript / regexp.h
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
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 }