Re-specify how the substring functions return lengths.

This commit is contained in:
Philip.Hazel 2014-08-29 12:12:34 +00:00
parent cfb78cbd53
commit 066aa00067
3 changed files with 94 additions and 93 deletions

View File

@ -271,7 +271,7 @@ typedef const PCRE2_UCHAR8 *PCRE2_SPTR8;
typedef const PCRE2_UCHAR16 *PCRE2_SPTR16; typedef const PCRE2_UCHAR16 *PCRE2_SPTR16;
typedef const PCRE2_UCHAR32 *PCRE2_SPTR32; typedef const PCRE2_UCHAR32 *PCRE2_SPTR32;
/* The PCRE2_SIZE type is used for all string lengths and offsets in PCRE22, /* The PCRE2_SIZE type is used for all string lengths and offsets in PCRE2,
including pattern offsets for errors and subject offsets after a match. We including pattern offsets for errors and subject offsets after a match. We
define special values to indicate zero-terminated strings and unset offsets in define special values to indicate zero-terminated strings and unset offsets in
the offset vector (ovector). */ the offset vector (ovector). */
@ -435,18 +435,18 @@ PCRE2_EXP_DECL PCRE2_SIZE pcre2_get_startchar(pcre2_match_data *);
#define PCRE2_SUBSTRING_FUNCTIONS \ #define PCRE2_SUBSTRING_FUNCTIONS \
PCRE2_EXP_DECL int pcre2_substring_copy_byname(pcre2_match_data *, \ PCRE2_EXP_DECL int pcre2_substring_copy_byname(pcre2_match_data *, \
PCRE2_SPTR, PCRE2_UCHAR *, size_t); \ PCRE2_SPTR, PCRE2_UCHAR *, PCRE2_SIZE *); \
PCRE2_EXP_DECL int pcre2_substring_copy_bynumber(pcre2_match_data *, \ PCRE2_EXP_DECL int pcre2_substring_copy_bynumber(pcre2_match_data *, \
int, PCRE2_UCHAR *, size_t); \ int, PCRE2_UCHAR *, PCRE2_SIZE *); \
PCRE2_EXP_DECL void pcre2_substring_free(PCRE2_UCHAR *); \ PCRE2_EXP_DECL void pcre2_substring_free(PCRE2_UCHAR *); \
PCRE2_EXP_DECL int pcre2_substring_get_byname(pcre2_match_data *, \ PCRE2_EXP_DECL int pcre2_substring_get_byname(pcre2_match_data *, \
PCRE2_SPTR, PCRE2_UCHAR **); \ PCRE2_SPTR, PCRE2_UCHAR **, PCRE2_SIZE *); \
PCRE2_EXP_DECL int pcre2_substring_get_bynumber(pcre2_match_data *, \ PCRE2_EXP_DECL int pcre2_substring_get_bynumber(pcre2_match_data *, \
int, PCRE2_UCHAR **); \ int, PCRE2_UCHAR **, PCRE2_SIZE *); \
PCRE2_EXP_DECL int pcre2_substring_length_byname(pcre2_match_data *, \ PCRE2_EXP_DECL int pcre2_substring_length_byname(pcre2_match_data *, \
PCRE2_SPTR); \ PCRE2_SPTR, PCRE2_SIZE *); \
PCRE2_EXP_DECL int pcre2_substring_length_bynumber(pcre2_match_data *, \ PCRE2_EXP_DECL int pcre2_substring_length_bynumber(pcre2_match_data *, \
int); \ int, PCRE2_SIZE *); \
PCRE2_EXP_DECL int pcre2_substring_nametable_scan(const pcre2_code *, \ PCRE2_EXP_DECL int pcre2_substring_nametable_scan(const pcre2_code *, \
PCRE2_SPTR, PCRE2_SPTR *, PCRE2_SPTR *); \ PCRE2_SPTR, PCRE2_SPTR *, PCRE2_SPTR *); \
PCRE2_EXP_DECL int pcre2_substring_number_from_name(\ PCRE2_EXP_DECL int pcre2_substring_number_from_name(\

View File

@ -59,11 +59,9 @@ Arguments:
match_data points to the match data match_data points to the match data
stringname the name of the required substring stringname the name of the required substring
buffer where to put the substring buffer where to put the substring
size the size of the buffer sizeptr the size of the buffer, updated to the size of the substring
Returns: if successful: Returns: if successful: zero
the length of the copied string, not including the zero
that is put on the end; can be zero
if not successful, a negative error code: if not successful, a negative error code:
PCRE2_ERROR_NOMEMORY: buffer too small PCRE2_ERROR_NOMEMORY: buffer too small
PCRE2_ERROR_NOSUBSTRING: no such captured substring PCRE2_ERROR_NOSUBSTRING: no such captured substring
@ -71,19 +69,19 @@ Returns: if successful:
PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
pcre2_substring_copy_byname(pcre2_match_data *match_data, PCRE2_SPTR stringname, pcre2_substring_copy_byname(pcre2_match_data *match_data, PCRE2_SPTR stringname,
PCRE2_UCHAR *buffer, size_t size) PCRE2_UCHAR *buffer, PCRE2_SIZE *sizeptr)
{ {
PCRE2_SPTR first; PCRE2_SPTR first;
PCRE2_SPTR last; PCRE2_SPTR last;
PCRE2_SPTR entry; PCRE2_SPTR entry;
int entrysize = pcre2_substring_nametable_scan(match_data->code, stringname, int entrysize = pcre2_substring_nametable_scan(match_data->code, stringname,
&first, &last); &first, &last);
if (entrysize <= 0) return entrysize; if (entrysize < 0) return entrysize;
for (entry = first; entry <= last; entry += entrysize) for (entry = first; entry <= last; entry += entrysize)
{ {
uint16_t n = GET2(entry, 0); uint16_t n = GET2(entry, 0);
if (n < match_data->oveccount && match_data->ovector[n*2] != PCRE2_UNSET) if (n < match_data->oveccount && match_data->ovector[n*2] != PCRE2_UNSET)
return pcre2_substring_copy_bynumber(match_data, n, buffer, size); return pcre2_substring_copy_bynumber(match_data, n, buffer, sizeptr);
} }
return PCRE2_ERROR_NOSUBSTRING; return PCRE2_ERROR_NOSUBSTRING;
} }
@ -101,11 +99,9 @@ Arguments:
match_data points to the match data match_data points to the match data
stringnumber the number of the required substring stringnumber the number of the required substring
buffer where to put the substring buffer where to put the substring
size the size of the buffer sizeptr the size of the buffer, updated to the size of the substring
Returns: if successful: Returns: if successful: 0
the length of the copied string, not including the zero
that is put on the end; can be zero
if not successful, a negative error code: if not successful, a negative error code:
PCRE2_ERROR_NOMEMORY: buffer too small PCRE2_ERROR_NOMEMORY: buffer too small
PCRE2_ERROR_NOSUBSTRING: no such captured substring PCRE2_ERROR_NOSUBSTRING: no such captured substring
@ -113,20 +109,21 @@ Returns: if successful:
PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
pcre2_substring_copy_bynumber(pcre2_match_data *match_data, int stringnumber, pcre2_substring_copy_bynumber(pcre2_match_data *match_data, int stringnumber,
PCRE2_UCHAR *buffer, size_t size) PCRE2_UCHAR *buffer, PCRE2_SIZE *sizeptr)
{ {
size_t left, right; PCRE2_SIZE left, right;
size_t p = 0; PCRE2_SIZE p = 0;
PCRE2_SPTR subject = match_data->subject; PCRE2_SPTR subject = match_data->subject;
if (stringnumber >= match_data->oveccount || if (stringnumber >= match_data->oveccount ||
stringnumber > match_data->code->top_bracket || stringnumber > match_data->code->top_bracket ||
(left = match_data->ovector[stringnumber*2]) == PCRE2_UNSET) (left = match_data->ovector[stringnumber*2]) == PCRE2_UNSET)
return PCRE2_ERROR_NOSUBSTRING; return PCRE2_ERROR_NOSUBSTRING;
right = match_data->ovector[stringnumber*2+1]; right = match_data->ovector[stringnumber*2+1];
if (right - left + 1 > size) return PCRE2_ERROR_NOMEMORY; if (right - left + 1 > *sizeptr) return PCRE2_ERROR_NOMEMORY;
while (left < right) buffer[p++] = subject[left++]; while (left < right) buffer[p++] = subject[left++];
buffer[p] = 0; buffer[p] = 0;
return p; *sizeptr = p;
return 0;
} }
@ -143,10 +140,9 @@ Arguments:
match_data pointer to match_data match_data pointer to match_data
stringname the name of the required substring stringname the name of the required substring
stringptr where to put the pointer to the new memory stringptr where to put the pointer to the new memory
sizeptr where to put the length of the substring
Returns: if successful: Returns: if successful: zero
the length of the copied string, not including the zero
that is put on the end; can be zero
if not successful, a negative value: if not successful, a negative value:
PCRE2_ERROR_NOMEMORY: couldn't get memory PCRE2_ERROR_NOMEMORY: couldn't get memory
PCRE2_ERROR_NOSUBSTRING: no such captured substring PCRE2_ERROR_NOSUBSTRING: no such captured substring
@ -154,19 +150,19 @@ Returns: if successful:
PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
pcre2_substring_get_byname(pcre2_match_data *match_data, pcre2_substring_get_byname(pcre2_match_data *match_data,
PCRE2_SPTR stringname, PCRE2_UCHAR **stringptr) PCRE2_SPTR stringname, PCRE2_UCHAR **stringptr, PCRE2_SIZE *sizeptr)
{ {
PCRE2_SPTR first; PCRE2_SPTR first;
PCRE2_SPTR last; PCRE2_SPTR last;
PCRE2_SPTR entry; PCRE2_SPTR entry;
int entrysize = pcre2_substring_nametable_scan(match_data->code, stringname, int entrysize = pcre2_substring_nametable_scan(match_data->code, stringname,
&first, &last); &first, &last);
if (entrysize <= 0) return entrysize; if (entrysize < 0) return entrysize;
for (entry = first; entry <= last; entry += entrysize) for (entry = first; entry <= last; entry += entrysize)
{ {
uint16_t n = GET2(entry, 0); uint16_t n = GET2(entry, 0);
if (n < match_data->oveccount && match_data->ovector[n*2] != PCRE2_UNSET) if (n < match_data->oveccount && match_data->ovector[n*2] != PCRE2_UNSET)
return pcre2_substring_get_bynumber(match_data, n, stringptr); return pcre2_substring_get_bynumber(match_data, n, stringptr, sizeptr);
} }
return PCRE2_ERROR_NOSUBSTRING; return PCRE2_ERROR_NOSUBSTRING;
} }
@ -184,10 +180,9 @@ Arguments:
match_data points to match data match_data points to match data
stringnumber the number of the required substring stringnumber the number of the required substring
stringptr where to put a pointer to the new memory stringptr where to put a pointer to the new memory
sizeptr where to put the size of the substring
Returns: if successful: Returns: if successful: zero
the length of the string, not including the zero that
is put on the end; can be zero
if not successful a negative error code: if not successful a negative error code:
PCRE2_ERROR_NOMEMORY: failed to get memory PCRE2_ERROR_NOMEMORY: failed to get memory
PCRE2_ERROR_NOSUBSTRING: substring not present PCRE2_ERROR_NOSUBSTRING: substring not present
@ -195,10 +190,10 @@ Returns: if successful:
PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
pcre2_substring_get_bynumber(pcre2_match_data *match_data, int stringnumber, pcre2_substring_get_bynumber(pcre2_match_data *match_data, int stringnumber,
PCRE2_UCHAR **stringptr) PCRE2_UCHAR **stringptr, PCRE2_SIZE *sizeptr)
{ {
size_t left, right; PCRE2_SIZE left, right;
size_t p = 0; PCRE2_SIZE p = 0;
void *block; void *block;
PCRE2_UCHAR *yield; PCRE2_UCHAR *yield;
@ -217,7 +212,8 @@ yield = (PCRE2_UCHAR *)((char *)block + sizeof(pcre2_memctl));
while (left < right) yield[p++] = subject[left++]; while (left < right) yield[p++] = subject[left++];
yield[p] = 0; yield[p] = 0;
*stringptr = yield; *stringptr = yield;
return p; *sizeptr = p;
return 0;
} }
@ -250,14 +246,14 @@ permits duplicate names, the first substring that is set is chosen.
Arguments: Arguments:
match_data pointer to match data match_data pointer to match data
stringname the name of the required substring stringname the name of the required substring
sizeptr where to put the length
Returns: a non-negative length if successful Returns: 0 if successful, else a negative error number
a negative error code otherwise
*/ */
PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
pcre2_substring_length_byname(pcre2_match_data *match_data, pcre2_substring_length_byname(pcre2_match_data *match_data,
PCRE2_SPTR stringname) PCRE2_SPTR stringname, PCRE2_SIZE *sizeptr)
{ {
PCRE2_SPTR first; PCRE2_SPTR first;
PCRE2_SPTR last; PCRE2_SPTR last;
@ -269,7 +265,7 @@ for (entry = first; entry <= last; entry += entrysize)
{ {
uint16_t n = GET2(entry, 0); uint16_t n = GET2(entry, 0);
if (n < match_data->oveccount && match_data->ovector[n*2] != PCRE2_UNSET) if (n < match_data->oveccount && match_data->ovector[n*2] != PCRE2_UNSET)
return pcre2_substring_length_bynumber(match_data, n); return pcre2_substring_length_bynumber(match_data, n, sizeptr);
} }
return PCRE2_ERROR_NOSUBSTRING; return PCRE2_ERROR_NOSUBSTRING;
} }
@ -285,21 +281,22 @@ return PCRE2_ERROR_NOSUBSTRING;
Arguments: Arguments:
match_data pointer to match data match_data pointer to match data
stringnumber the number of the required substring stringnumber the number of the required substring
sizeptr where to put the length
Returns: a non-negative length if successful Returns: 0 if successful, else a negative error number
a negative error code otherwise
*/ */
PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
pcre2_substring_length_bynumber(pcre2_match_data *match_data, pcre2_substring_length_bynumber(pcre2_match_data *match_data,
int stringnumber) int stringnumber, PCRE2_SIZE *sizeptr)
{ {
if (stringnumber >= match_data->oveccount || if (stringnumber >= match_data->oveccount ||
stringnumber > match_data->code->top_bracket || stringnumber > match_data->code->top_bracket ||
match_data->ovector[stringnumber*2] == PCRE2_UNSET) match_data->ovector[stringnumber*2] == PCRE2_UNSET)
return PCRE2_ERROR_NOSUBSTRING; return PCRE2_ERROR_NOSUBSTRING;
return match_data->ovector[stringnumber*2 + 1] - *sizeptr = match_data->ovector[stringnumber*2 + 1] -
match_data->ovector[stringnumber*2]; match_data->ovector[stringnumber*2];
return 0;
} }
@ -327,11 +324,11 @@ Returns: if successful: 0
PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
pcre2_substring_list_get(pcre2_match_data *match_data, PCRE2_UCHAR ***listptr, pcre2_substring_list_get(pcre2_match_data *match_data, PCRE2_UCHAR ***listptr,
size_t **lengthsptr) PCRE2_SIZE **lengthsptr)
{ {
int i, count, count2; int i, count, count2;
size_t size; PCRE2_SIZE size;
size_t *lensp; PCRE2_SIZE *lensp;
pcre2_memctl *memp; pcre2_memctl *memp;
PCRE2_UCHAR **listp; PCRE2_UCHAR **listp;
PCRE2_UCHAR *sp; PCRE2_UCHAR *sp;
@ -342,7 +339,7 @@ if ((count = match_data->rc) < 0) return count;
count2 = 2*count; count2 = 2*count;
ovector = match_data->ovector; ovector = match_data->ovector;
size = sizeof(pcre2_memctl) + sizeof(PCRE2_UCHAR *); /* For final NULL */ size = sizeof(pcre2_memctl) + sizeof(PCRE2_UCHAR *); /* For final NULL */
if (lengthsptr != NULL) size += sizeof(size_t) * count; /* For lengths */ if (lengthsptr != NULL) size += sizeof(PCRE2_SIZE) * count; /* For lengths */
for (i = 0; i < count2; i += 2) for (i = 0; i < count2; i += 2)
size += sizeof(PCRE2_UCHAR *) + CU2BYTES(ovector[i+1] - ovector[i] + 1); size += sizeof(PCRE2_UCHAR *) + CU2BYTES(ovector[i+1] - ovector[i] + 1);
@ -350,7 +347,7 @@ memp = PRIV(memctl_malloc)(size, (pcre2_memctl *)match_data);
if (memp == NULL) return PCRE2_ERROR_NOMEMORY; if (memp == NULL) return PCRE2_ERROR_NOMEMORY;
*listptr = listp = (PCRE2_UCHAR **)((char *)memp + sizeof(pcre2_memctl)); *listptr = listp = (PCRE2_UCHAR **)((char *)memp + sizeof(pcre2_memctl));
lensp = (size_t *)((char *)listp + sizeof(PCRE2_UCHAR *) * (count + 1)); lensp = (PCRE2_SIZE *)((char *)listp + sizeof(PCRE2_UCHAR *) * (count + 1));
if (lengthsptr == NULL) if (lengthsptr == NULL)
{ {
@ -360,7 +357,7 @@ if (lengthsptr == NULL)
else else
{ {
*lengthsptr = lensp; *lengthsptr = lensp;
sp = (PCRE2_UCHAR *)((char *)lensp + sizeof(size_t) * count); sp = (PCRE2_UCHAR *)((char *)lensp + sizeof(PCRE2_SIZE) * count);
} }
for (i = 0; i < count2; i += 2) for (i = 0; i < count2; i += 2)

View File

@ -877,21 +877,21 @@ are supported. */
pcre2_substring_free_16((PCRE2_UCHAR16 *)a); \ pcre2_substring_free_16((PCRE2_UCHAR16 *)a); \
else pcre2_substring_free_32((PCRE2_UCHAR32 *)a) else pcre2_substring_free_32((PCRE2_UCHAR32 *)a)
#define PCRE2_SUBSTRING_GET_BYNAME(a,b,c,d) \ #define PCRE2_SUBSTRING_GET_BYNAME(a,b,c,d,e) \
if (test_mode == PCRE8_MODE) \ if (test_mode == PCRE8_MODE) \
a = pcre2_substring_get_byname_8(G(b,8),G(c,8),(PCRE2_UCHAR8 **)d); \ a = pcre2_substring_get_byname_8(G(b,8),G(c,8),(PCRE2_UCHAR8 **)d,e); \
else if (test_mode == PCRE16_MODE) \ else if (test_mode == PCRE16_MODE) \
a = pcre2_substring_get_byname_16(G(b,16),G(c,16),(PCRE2_UCHAR16 **)d); \ a = pcre2_substring_get_byname_16(G(b,16),G(c,16),(PCRE2_UCHAR16 **)d,e); \
else \ else \
a = pcre2_substring_get_byname_32(G(b,32),G(c,32),(PCRE2_UCHAR32 **)d) a = pcre2_substring_get_byname_32(G(b,32),G(c,32),(PCRE2_UCHAR32 **)d,e)
#define PCRE2_SUBSTRING_GET_BYNUMBER(a,b,c,d) \ #define PCRE2_SUBSTRING_GET_BYNUMBER(a,b,c,d,e) \
if (test_mode == PCRE8_MODE) \ if (test_mode == PCRE8_MODE) \
a = pcre2_substring_get_bynumber_8(G(b,8),c,(PCRE2_UCHAR8 **)d); \ a = pcre2_substring_get_bynumber_8(G(b,8),c,(PCRE2_UCHAR8 **)d,e); \
else if (test_mode == PCRE16_MODE) \ else if (test_mode == PCRE16_MODE) \
a = pcre2_substring_get_bynumber_16(G(b,16),c,(PCRE2_UCHAR16 **)d); \ a = pcre2_substring_get_bynumber_16(G(b,16),c,(PCRE2_UCHAR16 **)d,e); \
else \ else \
a = pcre2_substring_get_bynumber_32(G(b,32),c,(PCRE2_UCHAR32 **)d) a = pcre2_substring_get_bynumber_32(G(b,32),c,(PCRE2_UCHAR32 **)d,e)
#define PCRE2_SUBSTRING_LIST_GET(a,b,c,d) \ #define PCRE2_SUBSTRING_LIST_GET(a,b,c,d) \
if (test_mode == PCRE8_MODE) \ if (test_mode == PCRE8_MODE) \
@ -1149,21 +1149,21 @@ the three different cases. */
G(pcre2_substring_free_,BITONE)((G(PCRE2_UCHAR,BITONE) *)a); \ G(pcre2_substring_free_,BITONE)((G(PCRE2_UCHAR,BITONE) *)a); \
else G(pcre2_substring_free_,BITTWO)((G(PCRE2_UCHAR,BITTWO) *)a) else G(pcre2_substring_free_,BITTWO)((G(PCRE2_UCHAR,BITTWO) *)a)
#define PCRE2_SUBSTRING_GET_BYNAME(a,b,c,d) \ #define PCRE2_SUBSTRING_GET_BYNAME(a,b,c,d,e) \
if (test_mode == G(G(PCRE,BITONE),_MODE)) \ if (test_mode == G(G(PCRE,BITONE),_MODE)) \
a = G(pcre2_substring_get_byname_,BITONE)(G(b,BITONE),G(c,BITONE),\ a = G(pcre2_substring_get_byname_,BITONE)(G(b,BITONE),G(c,BITONE),\
(G(PCRE2_UCHAR,BITONE) **)d); \ (G(PCRE2_UCHAR,BITONE) **)d,e); \
else \ else \
a = G(pcre2_substring_get_byname_,BITTWO)(G(b,BITTWO),G(c,BITTWO),\ a = G(pcre2_substring_get_byname_,BITTWO)(G(b,BITTWO),G(c,BITTWO),\
(G(PCRE2_UCHAR,BITTWO) **)d) (G(PCRE2_UCHAR,BITTWO) **)d,e)
#define PCRE2_SUBSTRING_GET_BYNUMBER(a,b,c,d) \ #define PCRE2_SUBSTRING_GET_BYNUMBER(a,b,c,d,e) \
if (test_mode == G(G(PCRE,BITONE),_MODE)) \ if (test_mode == G(G(PCRE,BITONE),_MODE)) \
a = G(pcre2_substring_get_bynumber_,BITONE)(G(b,BITONE),c,\ a = G(pcre2_substring_get_bynumber_,BITONE)(G(b,BITONE),c,\
(G(PCRE2_UCHAR,BITONE) **)d); \ (G(PCRE2_UCHAR,BITONE) **)d,e); \
else \ else \
a = G(pcre2_substring_get_bynumber_,BITTWO)(G(b,BITTWO),c,\ a = G(pcre2_substring_get_bynumber_,BITTWO)(G(b,BITTWO),c,\
(G(PCRE2_UCHAR,BITTWO) **)d) (G(PCRE2_UCHAR,BITTWO) **)d,e)
#define PCRE2_SUBSTRING_LIST_GET(a,b,c,d) \ #define PCRE2_SUBSTRING_LIST_GET(a,b,c,d) \
if (test_mode == G(G(PCRE,BITONE),_MODE)) \ if (test_mode == G(G(PCRE,BITONE),_MODE)) \
@ -1270,10 +1270,10 @@ the three different cases. */
#define PCRE2_SUBSTRING_COPY_BYNUMBER(a,b,c,d,e) \ #define PCRE2_SUBSTRING_COPY_BYNUMBER(a,b,c,d,e) \
a = pcre2_substring_copy_bynumber_8(G(b,8),c,(PCRE2_UCHAR8 *)d,e) a = pcre2_substring_copy_bynumber_8(G(b,8),c,(PCRE2_UCHAR8 *)d,e)
#define PCRE2_SUBSTRING_FREE(a) pcre2_substring_free_8((PCRE2_UCHAR8 *)a) #define PCRE2_SUBSTRING_FREE(a) pcre2_substring_free_8((PCRE2_UCHAR8 *)a)
#define PCRE2_SUBSTRING_GET_BYNAME(a,b,c,d) \ #define PCRE2_SUBSTRING_GET_BYNAME(a,b,c,d,e) \
a = pcre2_substring_get_byname_8(G(b,8),G(c,8),(PCRE2_UCHAR8 **)d) a = pcre2_substring_get_byname_8(G(b,8),G(c,8),(PCRE2_UCHAR8 **)d,e)
#define PCRE2_SUBSTRING_GET_BYNUMBER(a,b,c,d) \ #define PCRE2_SUBSTRING_GET_BYNUMBER(a,b,c,d,e) \
a = pcre2_substring_get_bynumber_8(G(b,8),c,(PCRE2_UCHAR8 **)d) a = pcre2_substring_get_bynumber_8(G(b,8),c,(PCRE2_UCHAR8 **)d,e)
#define PCRE2_SUBSTRING_LIST_GET(a,b,c,d) \ #define PCRE2_SUBSTRING_LIST_GET(a,b,c,d) \
a = pcre2_substring_list_get_8(G(b,8),(PCRE2_UCHAR8 ***)c,d) a = pcre2_substring_list_get_8(G(b,8),(PCRE2_UCHAR8 ***)c,d)
#define PCRE2_SUBSTRING_LIST_FREE(a) \ #define PCRE2_SUBSTRING_LIST_FREE(a) \
@ -1329,10 +1329,10 @@ the three different cases. */
#define PCRE2_SUBSTRING_COPY_BYNUMBER(a,b,c,d,e) \ #define PCRE2_SUBSTRING_COPY_BYNUMBER(a,b,c,d,e) \
a = pcre2_substring_copy_bynumber_16(G(b,16),c,(PCRE2_UCHAR16 *)d,e) a = pcre2_substring_copy_bynumber_16(G(b,16),c,(PCRE2_UCHAR16 *)d,e)
#define PCRE2_SUBSTRING_FREE(a) pcre2_substring_free_16((PCRE2_UCHAR16 *)a) #define PCRE2_SUBSTRING_FREE(a) pcre2_substring_free_16((PCRE2_UCHAR16 *)a)
#define PCRE2_SUBSTRING_GET_BYNAME(a,b,c,d) \ #define PCRE2_SUBSTRING_GET_BYNAME(a,b,c,d,e) \
a = pcre2_substring_get_byname_16(G(b,16),G(c,16),(PCRE2_UCHAR16 **)d) a = pcre2_substring_get_byname_16(G(b,16),G(c,16),(PCRE2_UCHAR16 **)d,e)
#define PCRE2_SUBSTRING_GET_BYNUMBER(a,b,c,d) \ #define PCRE2_SUBSTRING_GET_BYNUMBER(a,b,c,d,e) \
a = pcre2_substring_get_bynumber_16(G(b,16),c,(PCRE2_UCHAR16 **)d) a = pcre2_substring_get_bynumber_16(G(b,16),c,(PCRE2_UCHAR16 **)d,e)
#define PCRE2_SUBSTRING_LIST_GET(a,b,c,d) \ #define PCRE2_SUBSTRING_LIST_GET(a,b,c,d) \
a = pcre2_substring_list_get_16(G(b,16),(PCRE2_UCHAR16 ***)c,d) a = pcre2_substring_list_get_16(G(b,16),(PCRE2_UCHAR16 ***)c,d)
#define PCRE2_SUBSTRING_LIST_FREE(a) \ #define PCRE2_SUBSTRING_LIST_FREE(a) \
@ -1388,11 +1388,11 @@ the three different cases. */
#define PCRE2_SUBSTRING_COPY_BYNUMBER(a,b,c,d,e) \ #define PCRE2_SUBSTRING_COPY_BYNUMBER(a,b,c,d,e) \
a = pcre2_substring_copy_bynumber_32(G(b,32),c,(PCRE2_UCHAR32 *)d,e); a = pcre2_substring_copy_bynumber_32(G(b,32),c,(PCRE2_UCHAR32 *)d,e);
#define PCRE2_SUBSTRING_FREE(a) pcre2_substring_free_32((PCRE2_UCHAR32 *)a) #define PCRE2_SUBSTRING_FREE(a) pcre2_substring_free_32((PCRE2_UCHAR32 *)a)
##define PCRE2_SUBSTRING_GET_BYNAME(a,b,c,d) \ ##define PCRE2_SUBSTRING_GET_BYNAME(a,b,c,d,e) \
a = pcre2_substring_get_byname_32(G(b,32),G(c,32),(PCRE2_UCHAR32 **)d) a = pcre2_substring_get_byname_32(G(b,32),G(c,32),(PCRE2_UCHAR32 **)d,e)
define PCRE2_SUBSTRING_GET_BYNUMBER(a,b,c,d) \ define PCRE2_SUBSTRING_GET_BYNUMBER(a,b,c,d,e) \
a = pcre2_substring_get_bynumber_32(G(b,32),c,(PCRE2_UCHAR32 **)d) a = pcre2_substring_get_bynumber_32(G(b,32),c,(PCRE2_UCHAR32 **)d)
#define PCRE2_SUBSTRING_LIST_GET(a,b,c,d) \ #define PCRE2_SUBSTRING_LIST_GET(a,b,c,d,e) \
a = pcre2_substring_list_get_32(G(b,32),(PCRE2_UCHAR32 ***)c,d) a = pcre2_substring_list_get_32(G(b,32),(PCRE2_UCHAR32 ***)c,d)
#define PCRE2_SUBSTRING_LIST_FREE(a) \ #define PCRE2_SUBSTRING_LIST_FREE(a) \
pcre2_substring_list_free_32((PCRE2_SPTR32 *)a) pcre2_substring_list_free_32((PCRE2_SPTR32 *)a)
@ -4543,10 +4543,11 @@ for (gmatched = 0;; gmatched++)
for (i = 0; i < MAXCPYGET && dat_datctl.copy_numbers[i] >= 0; i++) for (i = 0; i < MAXCPYGET && dat_datctl.copy_numbers[i] >= 0; i++)
{ {
int rc; int rc;
PCRE2_SIZE length;
uint32_t copybuffer[256]; uint32_t copybuffer[256];
uint32_t n = (uint32_t)(dat_datctl.copy_numbers[i]); uint32_t n = (uint32_t)(dat_datctl.copy_numbers[i]);
PCRE2_SUBSTRING_COPY_BYNUMBER(rc, match_data, n, copybuffer, length = sizeof(copybuffer)/code_unit_size;
sizeof(copybuffer)/code_unit_size); PCRE2_SUBSTRING_COPY_BYNUMBER(rc, match_data, n, copybuffer, &length);
if (rc < 0) if (rc < 0)
{ {
fprintf(outfile, "copy substring %d failed (%d): ", n, rc); fprintf(outfile, "copy substring %d failed (%d): ", n, rc);
@ -4557,8 +4558,8 @@ for (gmatched = 0;; gmatched++)
else else
{ {
fprintf(outfile, "%2dC ", n); fprintf(outfile, "%2dC ", n);
PCHARSV(copybuffer, 0, rc, utf, outfile); PCHARSV(copybuffer, 0, length, utf, outfile);
fprintf(outfile, " (%d)\n", rc); fprintf(outfile, " (%lu)\n", (unsigned long)length);
} }
} }
@ -4569,6 +4570,7 @@ for (gmatched = 0;; gmatched++)
{ {
int rc; int rc;
PCRE2_SIZE cnl; PCRE2_SIZE cnl;
PCRE2_SIZE length;
uint32_t copybuffer[256]; uint32_t copybuffer[256];
int namelen = strlen((const char *)nptr); int namelen = strlen((const char *)nptr);
if (namelen == 0) break; if (namelen == 0) break;
@ -4584,8 +4586,8 @@ for (gmatched = 0;; gmatched++)
if (test_mode == PCRE32_MODE)(void)to32(nptr, utf, &cnl); if (test_mode == PCRE32_MODE)(void)to32(nptr, utf, &cnl);
#endif #endif
PCRE2_SUBSTRING_COPY_BYNAME(rc, match_data, pbuffer, length = sizeof(copybuffer)/code_unit_size;
copybuffer, sizeof(copybuffer)/code_unit_size); PCRE2_SUBSTRING_COPY_BYNAME(rc, match_data, pbuffer, copybuffer, &length);
if (rc < 0) if (rc < 0)
{ {
fprintf(outfile, "copy substring '%s' failed (%d): ", nptr, rc); fprintf(outfile, "copy substring '%s' failed (%d): ", nptr, rc);
@ -4596,8 +4598,8 @@ for (gmatched = 0;; gmatched++)
else else
{ {
fprintf(outfile, " C "); fprintf(outfile, " C ");
PCHARSV(copybuffer, 0, rc, utf, outfile); PCHARSV(copybuffer, 0, length, utf, outfile);
fprintf(outfile, " (%d) %s\n", rc, nptr); fprintf(outfile, " (%lu) %s\n", (unsigned long)length, nptr);
} }
nptr += namelen + 1; nptr += namelen + 1;
} }
@ -4607,9 +4609,10 @@ for (gmatched = 0;; gmatched++)
for (i = 0; i < MAXCPYGET && dat_datctl.get_numbers[i] >= 0; i++) for (i = 0; i < MAXCPYGET && dat_datctl.get_numbers[i] >= 0; i++)
{ {
int rc; int rc;
PCRE2_SIZE length;
void *gotbuffer; void *gotbuffer;
uint32_t n = (uint32_t)(dat_datctl.get_numbers[i]); uint32_t n = (uint32_t)(dat_datctl.get_numbers[i]);
PCRE2_SUBSTRING_GET_BYNUMBER(rc, match_data, n, &gotbuffer); PCRE2_SUBSTRING_GET_BYNUMBER(rc, match_data, n, &gotbuffer, &length);
if (rc < 0) if (rc < 0)
{ {
fprintf(outfile, "get substring %d failed (%d): ", n, rc); fprintf(outfile, "get substring %d failed (%d): ", n, rc);
@ -4620,8 +4623,8 @@ for (gmatched = 0;; gmatched++)
else else
{ {
fprintf(outfile, "%2dG ", n); fprintf(outfile, "%2dG ", n);
PCHARSV(gotbuffer, 0, rc, utf, outfile); PCHARSV(gotbuffer, 0, length, utf, outfile);
fprintf(outfile, " (%d)\n", rc); fprintf(outfile, " (%lu)\n", (unsigned long)length);
PCRE2_SUBSTRING_FREE(gotbuffer); PCRE2_SUBSTRING_FREE(gotbuffer);
} }
} }
@ -4632,6 +4635,7 @@ for (gmatched = 0;; gmatched++)
for (;;) for (;;)
{ {
PCRE2_SIZE cnl; PCRE2_SIZE cnl;
PCRE2_SIZE length;
void *gotbuffer; void *gotbuffer;
int rc; int rc;
int namelen = strlen((const char *)nptr); int namelen = strlen((const char *)nptr);
@ -4648,7 +4652,7 @@ for (gmatched = 0;; gmatched++)
if (test_mode == PCRE32_MODE)(void)to32(nptr, utf, &cnl); if (test_mode == PCRE32_MODE)(void)to32(nptr, utf, &cnl);
#endif #endif
PCRE2_SUBSTRING_GET_BYNAME(rc, match_data, pbuffer, &gotbuffer); PCRE2_SUBSTRING_GET_BYNAME(rc, match_data, pbuffer, &gotbuffer, &length);
if (rc < 0) if (rc < 0)
{ {
fprintf(outfile, "get substring '%s' failed (%d): ", nptr, rc); fprintf(outfile, "get substring '%s' failed (%d): ", nptr, rc);
@ -4659,8 +4663,8 @@ for (gmatched = 0;; gmatched++)
else else
{ {
fprintf(outfile, " G "); fprintf(outfile, " G ");
PCHARSV(gotbuffer, 0, rc, utf, outfile); PCHARSV(gotbuffer, 0, length, utf, outfile);
fprintf(outfile, " (%d) %s\n", rc, nptr); fprintf(outfile, " (%lu) %s\n", (unsigned long)length, nptr);
PCRE2_SUBSTRING_FREE(gotbuffer); PCRE2_SUBSTRING_FREE(gotbuffer);
} }
nptr += namelen + 1; nptr += namelen + 1;
@ -4672,7 +4676,7 @@ for (gmatched = 0;; gmatched++)
{ {
int rc; int rc;
void **stringlist; void **stringlist;
size_t *lengths; PCRE2_SIZE *lengths;
PCRE2_SUBSTRING_LIST_GET(rc, match_data, &stringlist, &lengths); PCRE2_SUBSTRING_LIST_GET(rc, match_data, &stringlist, &lengths);
if (rc < 0) if (rc < 0)
{ {