| |
| /* |
| * Copyright (C) Igor Sysoev |
| * Copyright (C) NGINX, Inc. |
| */ |
| |
| #ifndef _NJS_REGEX_H_INCLUDED_ |
| #define _NJS_REGEX_H_INCLUDED_ |
| |
| #define NJS_REGEX_UNSET (size_t) (-1) |
| |
| |
| typedef enum { |
| NJS_REGEX_INVALID_FLAG = -1, |
| NJS_REGEX_NO_FLAGS = 0, |
| NJS_REGEX_GLOBAL = 1, |
| NJS_REGEX_IGNORE_CASE = 2, |
| NJS_REGEX_MULTILINE = 4, |
| NJS_REGEX_STICKY = 8, |
| NJS_REGEX_UTF8 = 16, |
| } njs_regex_flags_t; |
| |
| |
| typedef void *(*njs_pcre_malloc_t)(size_t size, void *memory_data); |
| typedef void (*njs_pcre_free_t)(void *p, void *memory_data); |
| |
| |
| typedef struct { |
| void *code; |
| void *extra; |
| int ncaptures; |
| int backrefmax; |
| int nentries; |
| int entry_size; |
| char *entries; |
| } njs_regex_t; |
| |
| |
| #ifdef NJS_HAVE_PCRE2 |
| |
| #define njs_regex_generic_ctx_t void |
| #define njs_regex_compile_ctx_t void |
| #define njs_regex_match_data_t void |
| |
| #else |
| |
| typedef struct { |
| njs_pcre_malloc_t private_malloc; |
| njs_pcre_free_t private_free; |
| void *memory_data; |
| } njs_regex_generic_ctx_t; |
| |
| #define njs_regex_compile_ctx_t void |
| |
| typedef struct { |
| int ncaptures; |
| /* |
| * Each capture is stored in 3 "int" vector elements. |
| * The N capture positions are stored in [n * 2] and [n * 2 + 1] elements. |
| * The 3rd bookkeeping elements are at the end of the vector. |
| * The first vector is for the "$0" capture and it is always allocated. |
| */ |
| int captures[3]; |
| } njs_regex_match_data_t; |
| |
| #endif |
| |
| |
| NJS_EXPORT njs_regex_generic_ctx_t * |
| njs_regex_generic_ctx_create(njs_pcre_malloc_t private_malloc, |
| njs_pcre_free_t private_free, void *memory_data); |
| NJS_EXPORT njs_regex_compile_ctx_t *njs_regex_compile_ctx_create( |
| njs_regex_generic_ctx_t *ctx); |
| NJS_EXPORT njs_int_t njs_regex_escape(njs_mp_t *mp, njs_str_t *text); |
| NJS_EXPORT njs_int_t njs_regex_compile(njs_regex_t *regex, u_char *source, |
| size_t len, njs_regex_flags_t flags, njs_regex_compile_ctx_t *ctx, |
| njs_trace_t *trace); |
| NJS_EXPORT njs_bool_t njs_regex_is_valid(njs_regex_t *regex); |
| NJS_EXPORT njs_int_t njs_regex_named_captures(njs_regex_t *regex, |
| njs_str_t *name, int n); |
| NJS_EXPORT njs_regex_match_data_t *njs_regex_match_data(njs_regex_t *regex, |
| njs_regex_generic_ctx_t *ctx); |
| NJS_EXPORT void njs_regex_match_data_free(njs_regex_match_data_t *match_data, |
| njs_regex_generic_ctx_t *ctx); |
| NJS_EXPORT njs_int_t njs_regex_match(njs_regex_t *regex, const u_char *subject, |
| size_t off, size_t len, njs_regex_match_data_t *match_data, |
| njs_trace_t *trace); |
| NJS_EXPORT size_t njs_regex_capture(njs_regex_match_data_t *match_data, |
| njs_uint_t n); |
| |
| |
| #endif /* _NJS_REGEX_H_INCLUDED_ */ |