Annotation of sbbs/include/mozilla/js/jsregexp.h, revision 1.1.1.1

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.
                     68:  * There's a list of these referenced by the classList field in the JSRegExp 
                     69:  * struct below. The initial state has startIndex set to the offset in the
                     70:  * original regexp source of the beginning of the class contents. The first 
                     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 {
                     81:             uint16  startIndex;
                     82:             uint16  length;
                     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 */
                    105:     uint16       parenCount;    /* number of parenthesized submatches */
                    106:     uint16       classCount;    /* count [...] bitmaps */
                    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: 
                    120: extern void
                    121: js_DestroyRegExp(JSContext *cx, JSRegExp *re);
                    122: 
                    123: /*
                    124:  * Execute re on input str at *indexp, returning null in *rval on mismatch.
                    125:  * On match, return true if test is true, otherwise return an array object.
                    126:  * Update *indexp and cx->regExpStatics always on match.
                    127:  */
                    128: extern JSBool
                    129: js_ExecuteRegExp(JSContext *cx, JSRegExp *re, JSString *str, size_t *indexp,
                    130:                 JSBool test, jsval *rval);
                    131: 
                    132: /*
                    133:  * These two add and remove GC roots, respectively, so their calls must be
                    134:  * well-ordered.
                    135:  */
                    136: extern JSBool
                    137: js_InitRegExpStatics(JSContext *cx, JSRegExpStatics *res);
                    138: 
                    139: extern void
                    140: js_FreeRegExpStatics(JSContext *cx, JSRegExpStatics *res);
                    141: 
                    142: #define JSVAL_IS_REGEXP(cx, v)                                                \
                    143:     (JSVAL_IS_OBJECT(v) && JSVAL_TO_OBJECT(v) &&                              \
                    144:      OBJ_GET_CLASS(cx, JSVAL_TO_OBJECT(v)) == &js_RegExpClass)
                    145: 
                    146: extern JSClass js_RegExpClass;
                    147: 
                    148: extern JSObject *
                    149: js_InitRegExpClass(JSContext *cx, JSObject *obj);
                    150: 
                    151: /*
                    152:  * Export js_regexp_toString to the decompiler.
                    153:  */
                    154: extern JSBool
                    155: js_regexp_toString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
                    156:                    jsval *rval);
                    157: 
                    158: /*
                    159:  * Create, serialize/deserialize, or clone a RegExp object.
                    160:  */
                    161: extern JSObject *
                    162: js_NewRegExpObject(JSContext *cx, JSTokenStream *ts,
                    163:                    jschar *chars, size_t length, uintN flags);
                    164: 
                    165: extern JSBool
                    166: js_XDRRegExp(JSXDRState *xdr, JSObject **objp);
                    167: 
                    168: extern JSObject *
                    169: js_CloneRegExpObject(JSContext *cx, JSObject *obj, JSObject *parent);
                    170: 
                    171: /*
                    172:  * Get and set the per-object (clone or clone-parent) lastIndex slot.
                    173:  */
                    174: extern JSBool
                    175: js_GetLastIndex(JSContext *cx, JSObject *obj, jsdouble *lastIndex);
                    176: 
                    177: extern JSBool
                    178: js_SetLastIndex(JSContext *cx, JSObject *obj, jsdouble lastIndex);
                    179: 
                    180: #endif /* jsregexp_h___ */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.