cosmopolitan/third_party/duktape/duk_regexp.h

85 lines
2.7 KiB
C

/*
* Regular expression structs, constants, and bytecode defines.
*/
#if !defined(DUK_REGEXP_H_INCLUDED)
#define DUK_REGEXP_H_INCLUDED
/* maximum bytecode copies for {n,m} quantifiers */
#define DUK_RE_MAX_ATOM_COPIES 1000
/* regexp compilation limits */
#define DUK_RE_COMPILE_TOKEN_LIMIT 100000000L /* 1e8 */
/* regexp execution limits */
#define DUK_RE_EXECUTE_STEPS_LIMIT 1000000000L /* 1e9 */
/* regexp opcodes */
#define DUK_REOP_MATCH 1
#define DUK_REOP_CHAR 2
#define DUK_REOP_PERIOD 3
#define DUK_REOP_RANGES 4
#define DUK_REOP_INVRANGES 5
#define DUK_REOP_JUMP 6
#define DUK_REOP_SPLIT1 7
#define DUK_REOP_SPLIT2 8
#define DUK_REOP_SQMINIMAL 9
#define DUK_REOP_SQGREEDY 10
#define DUK_REOP_SAVE 11
#define DUK_REOP_WIPERANGE 12
#define DUK_REOP_LOOKPOS 13
#define DUK_REOP_LOOKNEG 14
#define DUK_REOP_BACKREFERENCE 15
#define DUK_REOP_ASSERT_START 16
#define DUK_REOP_ASSERT_END 17
#define DUK_REOP_ASSERT_WORD_BOUNDARY 18
#define DUK_REOP_ASSERT_NOT_WORD_BOUNDARY 19
/* flags */
#define DUK_RE_FLAG_GLOBAL (1U << 0)
#define DUK_RE_FLAG_IGNORE_CASE (1U << 1)
#define DUK_RE_FLAG_MULTILINE (1U << 2)
struct duk_re_matcher_ctx {
duk_hthread *thr;
duk_uint32_t re_flags;
const duk_uint8_t *input;
const duk_uint8_t *input_end;
const duk_uint8_t *bytecode;
const duk_uint8_t *bytecode_end;
const duk_uint8_t **saved; /* allocated from valstack (fixed buffer) */
duk_uint32_t nsaved;
duk_uint32_t recursion_depth;
duk_uint32_t recursion_limit;
duk_uint32_t steps_count;
duk_uint32_t steps_limit;
};
struct duk_re_compiler_ctx {
duk_hthread *thr;
duk_uint32_t re_flags;
duk_lexer_ctx lex;
duk_re_token curr_token;
duk_bufwriter_ctx bw;
duk_uint32_t captures; /* highest capture number emitted so far (used as: ++captures) */
duk_uint32_t highest_backref;
duk_uint32_t recursion_depth;
duk_uint32_t recursion_limit;
duk_uint32_t nranges; /* internal temporary value, used for char classes */
};
/*
* Prototypes
*/
#if defined(DUK_USE_REGEXP_SUPPORT)
DUK_INTERNAL_DECL void duk_regexp_compile(duk_hthread *thr);
DUK_INTERNAL_DECL void duk_regexp_create_instance(duk_hthread *thr);
DUK_INTERNAL_DECL void duk_regexp_match(duk_hthread *thr);
DUK_INTERNAL_DECL void duk_regexp_match_force_global(duk_hthread *thr); /* hacky helper for String.prototype.split() */
#endif
#endif /* DUK_REGEXP_H_INCLUDED */