|
|
1.1 root 1: /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2: *
3: * ***** BEGIN LICENSE BLOCK *****
4: * Version: MPL 1.1/GPL 2.0/LGPL 2.1
5: *
6: * The contents of this file are subject to the Mozilla Public License Version
7: * 1.1 (the "License"); you may not use this file except in compliance with
8: * the License. You may obtain a copy of the License at
9: * http://www.mozilla.org/MPL/
10: *
11: * Software distributed under the License is distributed on an "AS IS" basis,
12: * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
13: * for the specific language governing rights and limitations under the
14: * License.
15: *
16: * The Original Code is Mozilla Communicator client code, released
17: * March 31, 1998.
18: *
19: * The Initial Developer of the Original Code is
20: * Netscape Communications Corporation.
21: * Portions created by the Initial Developer are Copyright (C) 1998
22: * the Initial Developer. All Rights Reserved.
23: *
24: * Contributor(s):
25: *
26: * Alternatively, the contents of this file may be used under the terms of
27: * either of the GNU General Public License Version 2 or later (the "GPL"),
28: * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
29: * in which case the provisions of the GPL or the LGPL are applicable instead
30: * of those above. If you wish to allow use of your version of this file only
31: * under the terms of either the GPL or the LGPL, and not to allow others to
32: * use your version of this file under the terms of the MPL, indicate your
33: * decision by deleting the provisions above and replace them with the notice
34: * and other provisions required by the GPL or the LGPL. If you do not delete
35: * the provisions above, a recipient may use your version of this file under
36: * the terms of any one of the MPL, the GPL or the LGPL.
37: *
38: * ***** END LICENSE BLOCK ***** */
39:
40: #ifndef jsregexp_h___
41: #define jsregexp_h___
42: /*
43: * JS regular expression interface.
44: */
45: #include <stddef.h>
46: #include "jspubtd.h"
47: #include "jsstr.h"
48:
49: #ifdef JS_THREADSAFE
50: #include "jsdhash.h"
51: #endif
52:
53: struct JSRegExpStatics {
54: JSString *input; /* input string to match (perl $_, GC root) */
55: JSBool multiline; /* whether input contains newlines (perl $*) */
56: uint16 parenCount; /* number of valid elements in parens[] */
57: uint16 moreLength; /* number of allocated elements in moreParens */
58: JSSubString parens[9]; /* last set of parens matched (perl $1, $2) */
59: JSSubString *moreParens; /* null or realloc'd vector for $10, etc. */
60: JSSubString lastMatch; /* last string matched (perl $&) */
61: JSSubString lastParen; /* last paren matched (perl $+) */
62: JSSubString leftContext; /* input to left of last match (perl $`) */
63: JSSubString rightContext; /* input to right of last match (perl $') */
64: };
65:
66: /*
67: * This struct holds a bitmap representation of a class from a regexp.
1.1.1.2 ! root 68: * There's a list of these referenced by the classList field in the JSRegExp
1.1 root 69: * struct below. The initial state has startIndex set to the offset in the
1.1.1.2 ! root 70: * original regexp source of the beginning of the class contents. The first
1.1 root 71: * use of the class converts the source representation into a bitmap.
72: *
73: */
74: typedef struct RECharSet {
75: JSPackedBool converted;
76: JSPackedBool sense;
77: uint16 length;
78: union {
79: uint8 *bits;
80: struct {
1.1.1.2 ! root 81: size_t startIndex;
! 82: size_t length;
1.1 root 83: } src;
84: } u;
85: } RECharSet;
86:
87: /*
88: * This macro is safe because moreParens is guaranteed to be allocated and big
89: * enough to hold parenCount, or else be null when parenCount is 0.
90: */
91: #define REGEXP_PAREN_SUBSTRING(res, num) \
92: (((jsuint)(num) < (jsuint)(res)->parenCount) \
93: ? ((jsuint)(num) < 9) \
94: ? &(res)->parens[num] \
95: : &(res)->moreParens[(num) - 9] \
96: : &js_EmptySubString)
97:
98: typedef struct RENode RENode;
99:
100: struct JSRegExp {
101: jsrefcount nrefs; /* reference count */
102: uint16 flags; /* flags, see jsapi.h's JSREG_* defines */
103: uint16 cloneIndex; /* index in fp->vars or funobj->slots of
104: cloned regexp object */
1.1.1.2 ! root 105: size_t parenCount; /* number of parenthesized submatches */
! 106: size_t classCount; /* count [...] bitmaps */
1.1 root 107: RECharSet *classList; /* list of [...] bitmaps */
108: JSString *source; /* locked source string, sans // */
109: jsbytecode program[1]; /* regular expression bytecode */
110: };
111:
112: extern JSRegExp *
113: js_NewRegExp(JSContext *cx, JSTokenStream *ts,
114: JSString *str, uintN flags, JSBool flat);
115:
116: extern JSRegExp *
117: js_NewRegExpOpt(JSContext *cx, JSTokenStream *ts,
118: JSString *str, JSString *opt, JSBool flat);
119:
1.1.1.2 ! root 120: #define HOLD_REGEXP(cx, re) JS_ATOMIC_INCREMENT(&(re)->nrefs)
! 121: #define DROP_REGEXP(cx, re) js_DestroyRegExp(cx, re)
! 122:
1.1 root 123: extern void
124: js_DestroyRegExp(JSContext *cx, JSRegExp *re);
125:
126: /*
127: * Execute re on input str at *indexp, returning null in *rval on mismatch.
128: * On match, return true if test is true, otherwise return an array object.
129: * Update *indexp and cx->regExpStatics always on match.
130: */
131: extern JSBool
132: js_ExecuteRegExp(JSContext *cx, JSRegExp *re, JSString *str, size_t *indexp,
1.1.1.2 ! root 133: JSBool test, jsval *rval);
1.1 root 134:
135: /*
136: * These two add and remove GC roots, respectively, so their calls must be
137: * well-ordered.
138: */
139: extern JSBool
140: js_InitRegExpStatics(JSContext *cx, JSRegExpStatics *res);
141:
142: extern void
143: js_FreeRegExpStatics(JSContext *cx, JSRegExpStatics *res);
144:
145: #define JSVAL_IS_REGEXP(cx, v) \
146: (JSVAL_IS_OBJECT(v) && JSVAL_TO_OBJECT(v) && \
147: OBJ_GET_CLASS(cx, JSVAL_TO_OBJECT(v)) == &js_RegExpClass)
148:
149: extern JSClass js_RegExpClass;
150:
151: extern JSObject *
152: js_InitRegExpClass(JSContext *cx, JSObject *obj);
153:
154: /*
155: * Export js_regexp_toString to the decompiler.
156: */
157: extern JSBool
158: js_regexp_toString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
159: jsval *rval);
160:
161: /*
162: * Create, serialize/deserialize, or clone a RegExp object.
163: */
164: extern JSObject *
165: js_NewRegExpObject(JSContext *cx, JSTokenStream *ts,
166: jschar *chars, size_t length, uintN flags);
167:
168: extern JSBool
169: js_XDRRegExp(JSXDRState *xdr, JSObject **objp);
170:
171: extern JSObject *
172: js_CloneRegExpObject(JSContext *cx, JSObject *obj, JSObject *parent);
173:
174: /*
175: * Get and set the per-object (clone or clone-parent) lastIndex slot.
176: */
177: extern JSBool
178: js_GetLastIndex(JSContext *cx, JSObject *obj, jsdouble *lastIndex);
179:
180: extern JSBool
181: js_SetLastIndex(JSContext *cx, JSObject *obj, jsdouble lastIndex);
182:
183: #endif /* jsregexp_h___ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.