Revision: 162
http://www.exim.org/viewvc/pcre2?view=rev&revision=162
Author: ph10
Date: 2014-11-25 17:35:01 +0000 (Tue, 25 Nov 2014)
Log Message:
-----------
Change callouts to pass the user data as a separate argument.
Modified Paths:
--------------
code/trunk/doc/pcre2api.3
code/trunk/doc/pcre2callout.3
code/trunk/src/pcre2.h.in
code/trunk/src/pcre2_context.c
code/trunk/src/pcre2_dfa_match.c
code/trunk/src/pcre2_intmodedep.h
code/trunk/src/pcre2_jit_compile.c
code/trunk/src/pcre2_match.c
code/trunk/src/pcre2test.c
Modified: code/trunk/doc/pcre2api.3
===================================================================
--- code/trunk/doc/pcre2api.3 2014-11-25 11:55:07 UTC (rev 161)
+++ code/trunk/doc/pcre2api.3 2014-11-25 17:35:01 UTC (rev 162)
@@ -114,7 +114,7 @@
.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 @@
.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
Modified: code/trunk/doc/pcre2callout.3
===================================================================
--- code/trunk/doc/pcre2callout.3 2014-11-25 11:55:07 UTC (rev 161)
+++ code/trunk/doc/pcre2callout.3 2014-11-25 17:35:01 UTC (rev 162)
@@ -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 @@
.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 @@
.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 @@
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 @@
.rs
.sp
.nf
-Last updated: 23 November 2014
+Last updated: 25 November 2014
Copyright (c) 1997-2014 University of Cambridge.
.fi
Modified: code/trunk/src/pcre2.h.in
===================================================================
--- code/trunk/src/pcre2.h.in 2014-11-25 11:55:07 UTC (rev 161)
+++ code/trunk/src/pcre2.h.in 2014-11-25 17:35:01 UTC (rev 162)
@@ -324,7 +324,6 @@
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_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 *, \
Modified: code/trunk/src/pcre2_context.c
===================================================================
--- code/trunk/src/pcre2_context.c 2014-11-25 11:55:07 UTC (rev 161)
+++ code/trunk/src/pcre2_context.c 2014-11-25 17:35:01 UTC (rev 162)
@@ -331,7 +331,7 @@
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;
Modified: code/trunk/src/pcre2_dfa_match.c
===================================================================
--- code/trunk/src/pcre2_dfa_match.c 2014-11-25 11:55:07 UTC (rev 161)
+++ code/trunk/src/pcre2_dfa_match.c 2014-11-25 17:35:01 UTC (rev 162)
@@ -2615,7 +2615,6 @@
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 @@
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 @@
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 @@
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); }
Modified: code/trunk/src/pcre2_intmodedep.h
===================================================================
--- code/trunk/src/pcre2_intmodedep.h 2014-11-25 11:55:07 UTC (rev 161)
+++ code/trunk/src/pcre2_intmodedep.h 2014-11-25 17:35:01 UTC (rev 162)
@@ -577,7 +577,7 @@
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 @@
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 @@
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;
Modified: code/trunk/src/pcre2_jit_compile.c
===================================================================
--- code/trunk/src/pcre2_jit_compile.c 2014-11-25 11:55:07 UTC (rev 161)
+++ code/trunk/src/pcre2_jit_compile.c 2014-11-25 17:35:01 UTC (rev 162)
@@ -178,7 +178,7 @@
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 @@
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 @@
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. */
Modified: code/trunk/src/pcre2_match.c
===================================================================
--- code/trunk/src/pcre2_match.c 2014-11-25 11:55:07 UTC (rev 161)
+++ code/trunk/src/pcre2_match.c 2014-11-25 17:35:01 UTC (rev 162)
@@ -1311,7 +1311,6 @@
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 @@
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 @@
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 @@
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;
Modified: code/trunk/src/pcre2test.c
===================================================================
--- code/trunk/src/pcre2test.c 2014-11-25 11:55:07 UTC (rev 161)
+++ code/trunk/src/pcre2test.c 2014-11-25 17:35:01 UTC (rev 162)
@@ -929,11 +929,11 @@
#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 @@
#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 @@
#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 @@
#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 @@
#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 @@
*/
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 @@
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);