[Pcre-svn] [162] code/trunk: Change callouts to pass the use…

Top Page
Delete this message
Author: Subversion repository
Date:  
To: pcre-svn
Subject: [Pcre-svn] [162] code/trunk: Change callouts to pass the user data as a separate argument.
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);