Change callouts to pass the user data as a separate argument.
This commit is contained in:
parent
292c9799e1
commit
5f9ad579dc
@ -114,7 +114,7 @@ document for an overview of all the PCRE2 documentation.
|
||||
.B void pcre2_match_context_free(pcre2_match_context *\fImcontext\fP);
|
||||
.sp
|
||||
.B int pcre2_set_callout(pcre2_match_context *\fImcontext\fP,
|
||||
.B " int (*\fIcallout_function\fP)(pcre2_callout_block *),"
|
||||
.B " int (*\fIcallout_function\fP)(pcre2_callout_block *, void *),"
|
||||
.B " void *\fIcallout_data\fP);"
|
||||
.sp
|
||||
.B int pcre2_set_match_limit(pcre2_match_context *\fImcontext\fP,
|
||||
@ -645,7 +645,7 @@ PCRE2_ERROR_BADDATA if invalid data is detected.
|
||||
.sp
|
||||
.nf
|
||||
.B int pcre2_set_callout(pcre2_match_context *\fImcontext\fP,
|
||||
.B " int (*\fIcallout_function\fP)(pcre2_callout_block *),"
|
||||
.B " int (*\fIcallout_function\fP)(pcre2_callout_block *, void *),"
|
||||
.B " void *\fIcallout_data\fP);"
|
||||
.fi
|
||||
.sp
|
||||
|
@ -1,4 +1,4 @@
|
||||
.TH PCRE2CALLOUT 3 "23 November 2014" "PCRE2 10.00"
|
||||
.TH PCRE2CALLOUT 3 "25 November 2014" "PCRE2 10.00"
|
||||
.SH NAME
|
||||
PCRE2 - Perl-compatible regular expressions (revised API)
|
||||
.SH SYNOPSIS
|
||||
@ -7,7 +7,7 @@ PCRE2 - Perl-compatible regular expressions (revised API)
|
||||
.B #include <pcre2.h>
|
||||
.PP
|
||||
.SM
|
||||
.B int (*pcre2_callout)(pcre2_callout_block *);
|
||||
.B int (*pcre2_callout)(pcre2_callout_block *, void *);
|
||||
.
|
||||
.SH DESCRIPTION
|
||||
.rs
|
||||
@ -119,14 +119,19 @@ callouts such as the example above are obeyed.
|
||||
.sp
|
||||
During matching, when PCRE2 reaches a callout point, if an external function is
|
||||
set in the match context, it is called. This applies to both normal and DFA
|
||||
matching. The only argument to the callout function is a pointer to a
|
||||
\fBpcre2_callout\fP block. This structure contains the following fields:
|
||||
matching. The first argument to the callout function is a pointer to a
|
||||
\fBpcre2_callout\fP block. The second argument is the void * callout data that
|
||||
was supplied when the callout was set up by calling \fBpcre2_set_callout()\fP
|
||||
(see the
|
||||
.\" HREF
|
||||
\fBpcre2api\fP
|
||||
.\"
|
||||
documentation). The callout block structure contains the following fields:
|
||||
.sp
|
||||
uint32_t \fIversion\fP;
|
||||
uint32_t \fIcallout_number\fP;
|
||||
uint32_t \fIcapture_top\fP;
|
||||
uint32_t \fIcapture_last\fP;
|
||||
void *\fIcallout_data\fP;
|
||||
PCRE2_SIZE *\fIoffset_vector\fP;
|
||||
PCRE2_SPTR \fImark\fP;
|
||||
PCRE2_SPTR \fIsubject\fP;
|
||||
@ -177,15 +182,6 @@ outside the recursion, as do the values of all captured substrings. If no
|
||||
substrings have been captured, the value of \fIcapture_last\fP is 0. This is
|
||||
always the case for the DFA matching functions.
|
||||
.P
|
||||
The \fIcallout_data\fP field contains a value that is passed to a matching
|
||||
function specifically so that it can be passed back in callouts. It is set in
|
||||
the match context when the callout is set up by calling
|
||||
\fBpcre2_set_callout()\fP (see the
|
||||
.\" HREF
|
||||
\fBpcre2api\fP
|
||||
.\"
|
||||
documentation).
|
||||
.P
|
||||
The \fIpattern_position\fP field contains the offset to the next item to be
|
||||
matched in the pattern string.
|
||||
.P
|
||||
@ -236,6 +232,6 @@ Cambridge, England.
|
||||
.rs
|
||||
.sp
|
||||
.nf
|
||||
Last updated: 23 November 2014
|
||||
Last updated: 25 November 2014
|
||||
Copyright (c) 1997-2014 University of Cambridge.
|
||||
.fi
|
||||
|
@ -324,7 +324,6 @@ typedef struct pcre2_callout_block { \
|
||||
uint32_t callout_number; /* Number compiled into pattern */ \
|
||||
uint32_t capture_top; /* Max current capture */ \
|
||||
uint32_t capture_last; /* Most recently closed capture */ \
|
||||
void *callout_data; /* Data passed in with the call */ \
|
||||
PCRE2_SIZE *offset_vector; /* The offset vector */ \
|
||||
PCRE2_SPTR mark; /* Pointer to current mark or NULL */ \
|
||||
PCRE2_SPTR subject; /* The subject being matched */ \
|
||||
@ -378,7 +377,7 @@ PCRE2_EXP_DECL \
|
||||
pcre2_match_context *pcre2_match_context_create(pcre2_general_context *); \
|
||||
PCRE2_EXP_DECL void pcre2_match_context_free(pcre2_match_context *); \
|
||||
PCRE2_EXP_DECL int pcre2_set_callout(pcre2_match_context *, \
|
||||
int (*)(pcre2_callout_block *), void *); \
|
||||
int (*)(pcre2_callout_block *, void *), void *); \
|
||||
PCRE2_EXP_DECL int pcre2_set_match_limit(pcre2_match_context *, \
|
||||
uint32_t); \
|
||||
PCRE2_EXP_DECL int pcre2_set_recursion_limit(pcre2_match_context *, \
|
||||
|
@ -331,7 +331,7 @@ return 0;
|
||||
|
||||
PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
|
||||
pcre2_set_callout(pcre2_match_context *mcontext,
|
||||
int (*callout)(pcre2_callout_block *), void *callout_data)
|
||||
int (*callout)(pcre2_callout_block *, void *), void *callout_data)
|
||||
{
|
||||
mcontext->callout = callout;
|
||||
mcontext->callout_data = callout_data;
|
||||
|
@ -2615,7 +2615,6 @@ for (;;)
|
||||
cb.callout_number = code[LINK_SIZE+2];
|
||||
cb.capture_top = 1;
|
||||
cb.capture_last = 0;
|
||||
cb.callout_data = mb->callout_data;
|
||||
cb.offset_vector = offsets;
|
||||
cb.mark = NULL; /* No (*MARK) support */
|
||||
cb.subject = start_subject;
|
||||
@ -2624,7 +2623,8 @@ for (;;)
|
||||
cb.current_position = (PCRE2_SIZE)(ptr - start_subject);
|
||||
cb.pattern_position = GET(code, LINK_SIZE + 3);
|
||||
cb.next_item_length = GET(code, 3 + 2*LINK_SIZE);
|
||||
if ((rrc = (mb->callout)(&cb)) < 0) return rrc; /* Abandon */
|
||||
if ((rrc = (mb->callout)(&cb, mb->callout_data)) < 0)
|
||||
return rrc; /* Abandon */
|
||||
}
|
||||
if (rrc > 0) break; /* Fail this thread */
|
||||
code += PRIV(OP_lengths)[OP_CALLOUT]; /* Skip callout data */
|
||||
@ -2962,7 +2962,6 @@ for (;;)
|
||||
cb.callout_number = code[1];
|
||||
cb.capture_top = 1;
|
||||
cb.capture_last = 0;
|
||||
cb.callout_data = mb->callout_data;
|
||||
cb.offset_vector = offsets;
|
||||
cb.mark = NULL; /* No (*MARK) support */
|
||||
cb.subject = start_subject;
|
||||
@ -2971,7 +2970,8 @@ for (;;)
|
||||
cb.current_position = (PCRE2_SIZE)(ptr - start_subject);
|
||||
cb.pattern_position = GET(code, 2);
|
||||
cb.next_item_length = GET(code, 2 + LINK_SIZE);
|
||||
if ((rrc = (mb->callout)(&cb)) < 0) return rrc; /* Abandon */
|
||||
if ((rrc = (mb->callout)(&cb, mb->callout_data)) < 0)
|
||||
return rrc; /* Abandon */
|
||||
}
|
||||
if (rrc == 0)
|
||||
{ ADD_ACTIVE(state_offset + PRIV(OP_lengths)[OP_CALLOUT], 0); }
|
||||
|
@ -577,7 +577,7 @@ typedef struct pcre2_real_match_context {
|
||||
pcre2_jit_callback jit_callback;
|
||||
void *jit_callback_data;
|
||||
#endif
|
||||
int (*callout)(pcre2_callout_block *);
|
||||
int (*callout)(pcre2_callout_block *, void *);
|
||||
void *callout_data;
|
||||
uint32_t match_limit;
|
||||
uint32_t recursion_limit;
|
||||
@ -784,7 +784,7 @@ typedef struct match_block {
|
||||
recursion_info *recursive; /* Linked list of recursion data */
|
||||
ovecsave_frame *ovecsave_chain; /* Linked list of free ovecsave blocks */
|
||||
void *callout_data; /* To pass back to callouts */
|
||||
int (*callout)(pcre2_callout_block *); /* Callout function or NULL */
|
||||
int (*callout)(pcre2_callout_block *,void *); /* Callout function or NULL */
|
||||
#ifdef HEAP_MATCH_RECURSE
|
||||
void *match_frames_base; /* For remembering malloc'd frames */
|
||||
#endif
|
||||
@ -809,7 +809,7 @@ typedef struct dfa_match_block {
|
||||
PCRE2_UCHAR nl[4]; /* Newline string when fixed */
|
||||
uint16_t bsr_convention; /* \R interpretation */
|
||||
void *callout_data; /* To pass back to callouts */
|
||||
int (*callout)(pcre2_callout_block *); /* Callout function or NULL */
|
||||
int (*callout)(pcre2_callout_block *,void *); /* Callout function or NULL */
|
||||
dfa_recursion_info *recursive; /* Linked list of recursion data */
|
||||
} dfa_match_block;
|
||||
|
||||
|
@ -178,7 +178,7 @@ typedef struct jit_arguments {
|
||||
pcre2_match_data *match_data;
|
||||
PCRE2_SPTR startchar_ptr;
|
||||
PCRE2_UCHAR *mark_ptr;
|
||||
int (*callout)(pcre2_callout_block *);
|
||||
int (*callout)(pcre2_callout_block *, void *);
|
||||
void *callout_data;
|
||||
/* Everything else after. */
|
||||
sljit_ui limit_match;
|
||||
@ -6303,7 +6303,6 @@ if (arguments->callout == NULL)
|
||||
return 0;
|
||||
|
||||
callout_block->version = 0;
|
||||
callout_block->callout_data = arguments->callout_data;
|
||||
|
||||
/* Offsets in subject. */
|
||||
callout_block->subject_length = arguments->end - arguments->begin;
|
||||
@ -6325,7 +6324,7 @@ for (i = 2; i < oveccount; i += 2)
|
||||
callout_block->capture_top = (callout_block->capture_top >> 1) + 1;
|
||||
ovector[0] = PCRE2_UNSET;
|
||||
ovector[1] = PCRE2_UNSET;
|
||||
return (arguments->callout)(callout_block);
|
||||
return (arguments->callout)(callout_block, arguments->callout_data);
|
||||
}
|
||||
|
||||
/* Aligning to 8 byte. */
|
||||
|
@ -1311,7 +1311,6 @@ for (;;)
|
||||
cb.callout_number = ecode[1];
|
||||
cb.capture_top = offset_top/2;
|
||||
cb.capture_last = mb->capture_last & CAPLMASK;
|
||||
cb.callout_data = mb->callout_data;
|
||||
cb.offset_vector = mb->ovector;
|
||||
cb.mark = mb->nomatch_mark;
|
||||
cb.subject = mb->start_subject;
|
||||
@ -1320,7 +1319,8 @@ for (;;)
|
||||
cb.current_position = (PCRE2_SIZE)(eptr - mb->start_subject);
|
||||
cb.pattern_position = GET(ecode, 2);
|
||||
cb.next_item_length = GET(ecode, 2 + LINK_SIZE);
|
||||
if ((rrc = mb->callout(&cb)) > 0) RRETURN(MATCH_NOMATCH);
|
||||
if ((rrc = mb->callout(&cb, mb->callout_data)) > 0)
|
||||
RRETURN(MATCH_NOMATCH);
|
||||
if (rrc < 0) RRETURN(rrc);
|
||||
}
|
||||
|
||||
@ -1715,7 +1715,6 @@ for (;;)
|
||||
cb.callout_number = ecode[1];
|
||||
cb.capture_top = offset_top/2;
|
||||
cb.capture_last = mb->capture_last & CAPLMASK;
|
||||
cb.callout_data = mb->callout_data;
|
||||
cb.offset_vector = mb->ovector;
|
||||
cb.mark = mb->nomatch_mark;
|
||||
cb.subject = mb->start_subject;
|
||||
@ -1724,7 +1723,8 @@ for (;;)
|
||||
cb.current_position = (PCRE2_SIZE)(eptr - mb->start_subject);
|
||||
cb.pattern_position = GET(ecode, 2);
|
||||
cb.next_item_length = GET(ecode, 2 + LINK_SIZE);
|
||||
if ((rrc = mb->callout(&cb)) > 0) RRETURN(MATCH_NOMATCH);
|
||||
if ((rrc = mb->callout(&cb, mb->callout_data)) > 0)
|
||||
RRETURN(MATCH_NOMATCH);
|
||||
if (rrc < 0) RRETURN(rrc);
|
||||
}
|
||||
ecode += 2 + 2*LINK_SIZE;
|
||||
|
@ -929,11 +929,11 @@ are supported. */
|
||||
|
||||
#define PCRE2_SET_CALLOUT(a,b,c) \
|
||||
if (test_mode == PCRE8_MODE) \
|
||||
pcre2_set_callout_8(G(a,8),(int (*)(pcre2_callout_block_8 *))b,c); \
|
||||
pcre2_set_callout_8(G(a,8),(int (*)(pcre2_callout_block_8 *, void *))b,c); \
|
||||
else if (test_mode == PCRE16_MODE) \
|
||||
pcre2_set_callout_16(G(a,16),(int (*)(pcre2_callout_block_16 *))b,c); \
|
||||
pcre2_set_callout_16(G(a,16),(int (*)(pcre2_callout_block_16 *, void *))b,c); \
|
||||
else \
|
||||
pcre2_set_callout_32(G(a,32),(int (*)(pcre2_callout_block_32 *))b,c);
|
||||
pcre2_set_callout_32(G(a,32),(int (*)(pcre2_callout_block_32 *, void *))b,c);
|
||||
|
||||
#define PCRE2_SET_CHARACTER_TABLES(a,b) \
|
||||
if (test_mode == PCRE8_MODE) \
|
||||
@ -1304,10 +1304,10 @@ the three different cases. */
|
||||
#define PCRE2_SET_CALLOUT(a,b,c) \
|
||||
if (test_mode == G(G(PCRE,BITONE),_MODE)) \
|
||||
G(pcre2_set_callout_,BITONE)(G(a,BITONE), \
|
||||
(int (*)(G(pcre2_callout_block_,BITONE) *))b,c); \
|
||||
(int (*)(G(pcre2_callout_block_,BITONE) *, void *))b,c); \
|
||||
else \
|
||||
G(pcre2_set_callout_,BITTWO)(G(a,BITTWO), \
|
||||
(int (*)(G(pcre2_callout_block_,BITTWO) *))b,c);
|
||||
(int (*)(G(pcre2_callout_block_,BITTWO) *, void *))b,c);
|
||||
|
||||
#define PCRE2_SET_CHARACTER_TABLES(a,b) \
|
||||
if (test_mode == G(G(PCRE,BITONE),_MODE)) \
|
||||
@ -1510,7 +1510,7 @@ the three different cases. */
|
||||
#define PCRE2_PATTERN_INFO(a,b,c,d) a = pcre2_pattern_info_8(G(b,8),c,d)
|
||||
#define PCRE2_PRINTINT(a) pcre2_printint_8(compiled_code8,outfile,a)
|
||||
#define PCRE2_SET_CALLOUT(a,b,c) \
|
||||
pcre2_set_callout_8(G(a,8),(int (*)(pcre2_callout_block_8 *))b,c)
|
||||
pcre2_set_callout_8(G(a,8),(int (*)(pcre2_callout_block_8 *, void *))b,c)
|
||||
#define PCRE2_SET_CHARACTER_TABLES(a,b) pcre2_set_character_tables_8(G(a,8),b)
|
||||
#define PCRE2_SET_COMPILE_RECURSION_GUARD(a,b) \
|
||||
pcre2_set_compile_recursion_guard_8(G(a,8),b)
|
||||
@ -1591,7 +1591,7 @@ the three different cases. */
|
||||
#define PCRE2_PATTERN_INFO(a,b,c,d) a = pcre2_pattern_info_16(G(b,16),c,d)
|
||||
#define PCRE2_PRINTINT(a) pcre2_printint_16(compiled_code16,outfile,a)
|
||||
#define PCRE2_SET_CALLOUT(a,b,c) \
|
||||
pcre2_set_callout_16(G(a,16),(int (*)(pcre2_callout_block_16 *))b,c);
|
||||
pcre2_set_callout_16(G(a,16),(int (*)(pcre2_callout_block_16 *, void *))b,c);
|
||||
#define PCRE2_SET_CHARACTER_TABLES(a,b) pcre2_set_character_tables_16(G(a,16),b)
|
||||
#define PCRE2_SET_COMPILE_RECURSION_GUARD(a,b) \
|
||||
pcre2_set_compile_recursion_guard_16(G(a,16),b)
|
||||
@ -1672,7 +1672,7 @@ the three different cases. */
|
||||
#define PCRE2_PATTERN_INFO(a,b,c,d) a = pcre2_pattern_info_32(G(b,32),c,d)
|
||||
#define PCRE2_PRINTINT(a) pcre2_printint_32(compiled_code32,outfile,a)
|
||||
#define PCRE2_SET_CALLOUT(a,b,c) \
|
||||
pcre2_set_callout_32(G(a,32),(int (*)(pcre2_callout_block_32 *))b,c);
|
||||
pcre2_set_callout_32(G(a,32),(int (*)(pcre2_callout_block_32 *, void *))b,c);
|
||||
#define PCRE2_SET_CHARACTER_TABLES(a,b) pcre2_set_character_tables_32(G(a,32),b)
|
||||
#define PCRE2_SET_COMPILE_RECURSION_GUARD(a,b) \
|
||||
pcre2_set_compile_recursion_guard_32(G(a,32),b)
|
||||
@ -4126,7 +4126,7 @@ Return:
|
||||
*/
|
||||
|
||||
static int
|
||||
callout_function(pcre2_callout_block_8 *cb)
|
||||
callout_function(pcre2_callout_block_8 *cb, void *callout_data_ptr)
|
||||
{
|
||||
uint32_t i, pre_start, post_start, subject_length;
|
||||
BOOL utf = (FLD(compiled_code, overall_options) & PCRE2_UTF) != 0;
|
||||
@ -4216,9 +4216,9 @@ if (cb->mark != last_callout_mark)
|
||||
last_callout_mark = cb->mark;
|
||||
}
|
||||
|
||||
if (cb->callout_data != NULL)
|
||||
if (callout_data_ptr != NULL)
|
||||
{
|
||||
int callout_data = *((int32_t *)(cb->callout_data));
|
||||
int callout_data = *((int32_t *)callout_data_ptr);
|
||||
if (callout_data != 0)
|
||||
{
|
||||
fprintf(outfile, "Callout data = %d\n", callout_data);
|
||||
|
Loading…
Reference in New Issue
Block a user