Merge pull request #184 from rstudio/fix/R-3.0.x-arm64

This commit is contained in:
Gábor Csárdi 2023-08-16 23:39:30 +02:00 committed by GitHub
commit 5f9777270c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 2844 additions and 0 deletions

View file

@ -75,6 +75,10 @@ patch_r() {
if [ -f "/patches/R-${1}-${OS_IDENTIFIER}.patch" ]; then
patch -p1 < "/patches/R-${1}-${OS_IDENTIFIER}.patch"
fi
if [ -f "/patches/R-${1}-`arch`.patch" ]; then
patch -p1 < "/patches/R-${1}-`arch`.patch"
fi
}
# compile_r() - $1 as r version

View file

@ -0,0 +1,709 @@
diff --git a/configure b/configure
index b3c299e..01f205d 100755
--- a/configure
+++ b/configure
@@ -5193,6 +5193,7 @@ elif test ${makeinfo_version_maj} -lt 4 \
else
r_cv_prog_makeinfo_v4=yes
fi
+r_cv_prog_makeinfo_v4=yes
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $r_cv_prog_makeinfo_v4" >&5
$as_echo "$r_cv_prog_makeinfo_v4" >&6; }
diff --git a/src/extra/tre/regcomp.c b/src/extra/tre/regcomp.c
index 93ddb92..31d4e52 100644
--- a/src/extra/tre/regcomp.c
+++ b/src/extra/tre/regcomp.c
@@ -99,7 +99,6 @@ tre_regncomp(regex_t *preg, const char *regex, size_t n, int cflags)
return ret;
}
-
/* this version takes bytes literally, to be used with raw vectors */
int
tre_regncompb(regex_t *preg, const char *regex, size_t n, int cflags)
@@ -131,7 +130,6 @@ tre_regcomp(regex_t *preg, const char *regex, int cflags)
return tre_regncomp(preg, regex, regex ? strlen(regex) : 0, cflags);
}
-/* R addition */
int
tre_regcompb(regex_t *preg, const char *regex, int cflags)
{
diff --git a/src/extra/tre/regexec.c b/src/extra/tre/regexec.c
index 6edaf81..d8f91a3 100644
--- a/src/extra/tre/regexec.c
+++ b/src/extra/tre/regexec.c
@@ -217,7 +217,6 @@ tre_regexec(const regex_t *preg, const char *str,
return tre_regnexec(preg, str, (unsigned)-1, nmatch, pmatch, eflags);
}
-/* R addition */
int
tre_regexecb(const regex_t *preg, const char *str,
size_t nmatch, regmatch_t pmatch[], int eflags)
@@ -329,7 +328,6 @@ tre_regaexec(const regex_t *preg, const char *str,
return tre_reganexec(preg, str, (unsigned)-1, match, params, eflags);
}
-/* R addition */
int
tre_regaexecb(const regex_t *preg, const char *str,
regamatch_t *match, regaparams_t params, int eflags)
diff --git a/src/extra/tre/tre-ast.h b/src/extra/tre/tre-ast.h
index 844aee3..d9af376 100644
--- a/src/extra/tre/tre-ast.h
+++ b/src/extra/tre/tre-ast.h
@@ -55,16 +55,11 @@ typedef struct {
tags, matching parameter settings, and all expressions that match one
character. */
typedef struct {
-#if 0 /* [i_a] must be able to carry the full span of all [Unicode] character codes *PLUS* these 'specials': TAG, PARAMETER, BACKREF, ASSERTION and EMPTY */
- tre_cint_t code_min;
- tre_cint_t code_max;
-#else
- int /* long */ code_min;
- int /* long */ code_max;
-#endif
+ long code_min;
+ long code_max;
int position;
union {
- tre_ctype_t classt; /* [i_a] wrong syntax colouring prevention */
+ tre_ctype_t class;
int *params;
} u;
tre_ctype_t *neg_classes;
diff --git a/src/extra/tre/tre-compile.c b/src/extra/tre/tre-compile.c
index 7886455..92c14ab 100644
--- a/src/extra/tre/tre-compile.c
+++ b/src/extra/tre/tre-compile.c
@@ -6,6 +6,13 @@
*/
+/*
+ TODO:
+ - Fix tre_ast_to_tnfa() to recurse using a stack instead of recursive
+ function calls.
+*/
+
+
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif /* HAVE_CONFIG_H */
@@ -684,8 +691,8 @@ tre_copy_ast(tre_mem_t mem, tre_stack_t *stack, tre_ast_node_t *ast,
{
tre_literal_t *lit = node->obj;
int pos = lit->position;
- int min = lit->code_min;
- int max = lit->code_max;
+ int min = (int)lit->code_min;
+ int max = (int)lit->code_max;
if (!IS_SPECIAL(lit) || IS_BACKREF(lit))
{
/* XXX - e.g. [ab] has only one position but two
@@ -945,7 +952,7 @@ tre_expand_ast(tre_mem_t mem, tre_stack_t *stack, tre_ast_node_t *ast,
seq2 = copy;
if (seq2 == NULL)
return REG_ESPACE;
- tmp = tre_ast_new_literal(mem, EMPTY, EMPTY, -1);
+ tmp = tre_ast_new_literal(mem, EMPTY, -1, -1);
if (tmp == NULL)
return REG_ESPACE;
seq2 = tre_ast_new_union(mem, tmp, seq2);
@@ -1052,15 +1059,15 @@ tre_set_empty(tre_mem_t mem)
return NULL;
new_set[0].position = -1;
- new_set[0].code_min = EMPTY;
- new_set[0].code_max = EMPTY;
+ new_set[0].code_min = -1;
+ new_set[0].code_max = -1;
return new_set;
}
static tre_pos_and_tags_t *
tre_set_one(tre_mem_t mem, int position, int code_min, int code_max,
- tre_ctype_t classt, tre_ctype_t *neg_classes, int backref)
+ tre_ctype_t class, tre_ctype_t *neg_classes, int backref)
{
tre_pos_and_tags_t *new_set;
@@ -1071,12 +1078,12 @@ tre_set_one(tre_mem_t mem, int position, int code_min, int code_max,
new_set[0].position = position;
new_set[0].code_min = code_min;
new_set[0].code_max = code_max;
- new_set[0].classt = classt;
+ new_set[0].class = class;
new_set[0].neg_classes = neg_classes;
new_set[0].backref = backref;
new_set[1].position = -1;
- new_set[1].code_min = EMPTY;
- new_set[1].code_max = EMPTY;
+ new_set[1].code_min = -1;
+ new_set[1].code_max = -1;
return new_set;
}
@@ -1103,7 +1110,7 @@ tre_set_union(tre_mem_t mem, tre_pos_and_tags_t *set1, tre_pos_and_tags_t *set2,
new_set[s1].code_min = set1[s1].code_min;
new_set[s1].code_max = set1[s1].code_max;
new_set[s1].assertions = set1[s1].assertions | assertions;
- new_set[s1].classt = set1[s1].classt;
+ new_set[s1].class = set1[s1].class;
new_set[s1].neg_classes = set1[s1].neg_classes;
new_set[s1].backref = set1[s1].backref;
if (set1[s1].tags == NULL && tags == NULL)
@@ -1148,7 +1155,7 @@ tre_set_union(tre_mem_t mem, tre_pos_and_tags_t *set1, tre_pos_and_tags_t *set2,
new_set[s1 + s2].code_max = set2[s2].code_max;
/* XXX - why not | assertions here as well? */
new_set[s1 + s2].assertions = set2[s2].assertions;
- new_set[s1 + s2].classt = set2[s2].classt;
+ new_set[s1 + s2].class = set2[s2].class;
new_set[s1 + s2].neg_classes = set2[s2].neg_classes;
new_set[s1 + s2].backref = set2[s2].backref;
if (set2[s2].tags == NULL)
@@ -1231,7 +1238,7 @@ tre_match_empty(tre_stack_t *stack, tre_ast_node_t *node, int *tags,
break;
if (tags[i] < 0)
{
- tags[i] = lit->code_max;
+ tags[i] = (int)lit->code_max;
tags[i + 1] = -1;
}
}
@@ -1373,7 +1380,7 @@ tre_compute_nfl(tre_mem_t mem, tre_stack_t *stack, tre_ast_node_t *tree)
node->lastpos = tre_set_one(mem, lit->position,
(int)lit->code_min,
(int)lit->code_max,
- lit->u.classt, lit->neg_classes,
+ lit->u.class, lit->neg_classes,
-1);
if (!node->lastpos)
return REG_ESPACE;
@@ -1614,12 +1621,12 @@ tre_make_trans(tre_pos_and_tags_t *p1, tre_pos_and_tags_t *p2,
(trans + 1)->state = NULL;
/* Use the character ranges, assertions, etc. from `p1' for
the transition from `p1' to `p2'. */
- trans->code_min = p1->code_min;
- trans->code_max = p1->code_max;
+ trans->code_min = (tre_cint_t) p1->code_min;
+ trans->code_max = (tre_cint_t) p1->code_max;
trans->state = transitions + offs[p2->position];
trans->state_id = p2->position;
trans->assertions = p1->assertions | p2->assertions
- | (p1->classt ? ASSERT_CHAR_CLASS : 0)
+ | (p1->class ? ASSERT_CHAR_CLASS : 0)
| (p1->neg_classes != NULL ? ASSERT_CHAR_CLASS_NEG : 0);
if (p1->backref >= 0)
{
@@ -1629,7 +1636,7 @@ tre_make_trans(tre_pos_and_tags_t *p1, tre_pos_and_tags_t *p2,
trans->assertions |= ASSERT_BACKREF;
}
else
- trans->u.classt = p1->classt;
+ trans->u.class = p1->class;
if (p1->neg_classes != NULL)
{
for (i = 0; p1->neg_classes[i] != (tre_ctype_t)0; i++);
@@ -1743,8 +1750,8 @@ tre_make_trans(tre_pos_and_tags_t *p1, tre_pos_and_tags_t *p2,
DPRINT((", assert %d", trans->assertions));
if (trans->assertions & ASSERT_BACKREF)
DPRINT((", backref %d", trans->u.backref));
- else if (trans->u.classt)
- DPRINT((", class %ld", (long)trans->u.classt));
+ else if (trans->u.class)
+ DPRINT((", class %ld", (long)trans->u.class));
if (trans->neg_classes)
DPRINT((", neg_classes %p", trans->neg_classes));
if (trans->params)
@@ -1861,10 +1868,10 @@ tre_ast_to_tnfa(tre_ast_node_t *node, tre_tnfa_transition_t *transitions,
do \
{ \
errcode = err; \
- if (/*CONSTCOND*/1) \
+ if (/*CONSTCOND*/(void)1,1) \
goto error_exit; \
} \
- while (/*CONSTCOND*/0)
+ while (/*CONSTCOND*/(void)0,0)
int
@@ -2050,7 +2057,7 @@ tre_compile(regex_t *preg, const tre_char_t *regex, size_t n, int cflags)
if (TRE_MB_CUR_MAX == 1 && !tmp_ast_l->nullable)
{
int count = 0;
- int k; /* [i_a] */
+ tre_cint_t k;
DPRINT(("Characters that can start a match:"));
tnfa->firstpos_chars = xcalloc(256, sizeof(char));
if (tnfa->firstpos_chars == NULL)
@@ -2310,15 +2317,7 @@ tre_config(int query, void *result)
case TRE_CONFIG_VERSION:
*string_result = TRE_VERSION;
return REG_OK;
-
- case TRE_MB_CUR_MAX_VALUE: /* [i_a] */
-#if defined(TRE_MB_CUR_MAX)
- *int_result = TRE_MB_CUR_MAX;
-#else
- *int_result = 1;
-#endif
- break;
- }
+ }
return REG_NOMATCH;
}
diff --git a/src/extra/tre/tre-compile.h b/src/extra/tre/tre-compile.h
index 0d81cf2..51d5ac9 100644
--- a/src/extra/tre/tre-compile.h
+++ b/src/extra/tre/tre-compile.h
@@ -12,16 +12,11 @@
typedef struct {
int position;
-#if 0 /* [i_a] must be able to carry the full span of all [Unicode] character codes *PLUS* these 'specials': TAG, PARAMETER, BACKREF, ASSERTION and EMPTY */
- tre_cint_t code_min;
- tre_cint_t code_max;
-#else
int code_min;
int code_max;
-#endif
int *tags;
int assertions;
- tre_ctype_t classt;
+ tre_ctype_t class;
tre_ctype_t *neg_classes;
int backref;
int *params;
diff --git a/src/extra/tre/tre-internal.h b/src/extra/tre/tre-internal.h
index c1300ac..822998e 100644
--- a/src/extra/tre/tre-internal.h
+++ b/src/extra/tre/tre-internal.h
@@ -22,9 +22,9 @@
#ifdef TRE_DEBUG
#include <stdio.h>
-#define DPRINT(msg) do {printf msg; fflush(stdout);} while(/*CONSTCOND*/0)
+#define DPRINT(msg) do {printf msg; fflush(stdout);} while(/*CONSTCOND*/(void)0,0)
#else /* !TRE_DEBUG */
-#define DPRINT(msg) do { } while(/*CONSTCOND*/0)
+#define DPRINT(msg) do { } while(/*CONSTCOND*/(void)0,0)
#endif /* !TRE_DEBUG */
#define elementsof(x) ( sizeof(x) / sizeof(x[0]) )
@@ -151,13 +151,8 @@ typedef struct tnfa_transition tre_tnfa_transition_t;
struct tnfa_transition {
/* Range of accepted characters. */
-#if 0 /* [i_a] must be able to carry the full span of all [Unicode] character codes *PLUS* these 'specials': TAG, PARAMETER, BACKREF, ASSERTION and EMPTY */
tre_cint_t code_min;
tre_cint_t code_max;
-#else
- int code_min;
- int code_max;
-#endif
/* Pointer to the destination state. */
tre_tnfa_transition_t *state;
/* ID number of the destination state. */
@@ -171,7 +166,7 @@ struct tnfa_transition {
/* Assertion parameters. */
union {
/* Character class assertion. */
- tre_ctype_t classt;
+ tre_ctype_t class;
/* Back reference assertion. */
int backref;
} u;
diff --git a/src/extra/tre/tre-match-approx.c b/src/extra/tre/tre-match-approx.c
index 6011114..f08cd0f 100644
--- a/src/extra/tre/tre-match-approx.c
+++ b/src/extra/tre/tre-match-approx.c
@@ -328,7 +328,7 @@ tre_tnfa_run_approx(const tre_tnfa_t *tnfa, const void *string, int len,
GET_NEXT_WCHAR();
pos = 0;
- while (/*CONSTCOND*/1)
+ while (/*CONSTCOND*/(void)1,1)
{
DPRINT(("%03d:%2lc/%05d\n", pos, (tre_cint_t)next_c, (int)next_c));
diff --git a/src/extra/tre/tre-match-backtrack.c b/src/extra/tre/tre-match-backtrack.c
index 9630e81..9dd7e94 100644
--- a/src/extra/tre/tre-match-backtrack.c
+++ b/src/extra/tre/tre-match-backtrack.c
@@ -116,7 +116,7 @@ typedef struct tre_backtrack_struct {
#ifdef TRE_USE_ALLOCA
#define tre_bt_mem_new tre_mem_newa
#define tre_bt_mem_alloc tre_mem_alloca
-#define tre_bt_mem_destroy(obj) do { } while (0)
+#define tre_bt_mem_destroy(obj) do { } while (0,0)
#else /* !TRE_USE_ALLOCA */
#define tre_bt_mem_new tre_mem_new
#define tre_bt_mem_alloc tre_mem_alloc
@@ -173,7 +173,7 @@ typedef struct tre_backtrack_struct {
stack->item.tags[i] = (_tags)[i]; \
BT_STACK_MBSTATE_IN; \
} \
- while (/*CONSTCOND*/0)
+ while (/*CONSTCOND*/(void)0,0)
#define BT_STACK_POP() \
do \
@@ -186,13 +186,13 @@ typedef struct tre_backtrack_struct {
str_byte = stack->item.str_byte; \
BT_STACK_WIDE_OUT; \
state = stack->item.state; \
- next_c = (tre_char_t)stack->item.next_c; \
+ next_c = (tre_char_t) stack->item.next_c; \
for (i = 0; i < tnfa->num_tags; i++) \
tags[i] = stack->item.tags[i]; \
BT_STACK_MBSTATE_OUT; \
stack = stack->prev; \
} \
- while (/*CONSTCOND*/0)
+ while (/*CONSTCOND*/(void)0,0)
#undef MIN
#define MIN(a, b) ((a) <= (b) ? (a) : (b))
@@ -372,7 +372,7 @@ tre_tnfa_run_backtrack(const tre_tnfa_t *tnfa, const void *string,
if (state == NULL)
goto backtrack;
- while (/*CONSTCOND*/1)
+ while (/*CONSTCOND*/(void)1,1)
{
tre_tnfa_transition_t *next_state;
int empty_br_match;
@@ -632,7 +632,7 @@ tre_tnfa_run_backtrack(const tre_tnfa_t *tnfa, const void *string,
}
}
DPRINT(("restarting from next start position\n"));
- next_c = (tre_char_t)next_c_start;
+ next_c = (tre_char_t) next_c_start;
#ifdef TRE_MBSTATE
mbstate = mbstate_start;
#endif /* TRE_MBSTATE */
diff --git a/src/extra/tre/tre-match-parallel.c b/src/extra/tre/tre-match-parallel.c
index ddb9fda..6696d11 100644
--- a/src/extra/tre/tre-match-parallel.c
+++ b/src/extra/tre/tre-match-parallel.c
@@ -269,7 +269,7 @@ tre_tnfa_run_parallel(const tre_tnfa_t *tnfa, const void *string, int len,
DPRINT(("-------------+------------------------------------------------\n"));
reach_next_i = reach_next;
- while (/*CONSTCOND*/1)
+ while (/*CONSTCOND*/(void)1,1)
{
/* If no match found yet, add the initial states to `reach_next'. */
if (match_eo < 0)
diff --git a/src/extra/tre/tre-match-utils.h b/src/extra/tre/tre-match-utils.h
index 7d19c21..d0a4214 100644
--- a/src/extra/tre/tre-match-utils.h
+++ b/src/extra/tre/tre-match-utils.h
@@ -76,7 +76,7 @@
str_user_end = str_source->get_next_char(&next_c, &pos_add_next, \
str_source->context); \
} \
- } while(/*CONSTCOND*/0)
+ } while(/*CONSTCOND*/(void)0,0)
#else /* !TRE_MULTIBYTE */
@@ -107,7 +107,7 @@
str_user_end = str_source->get_next_char(&next_c, &pos_add_next, \
str_source->context); \
} \
- } while(/*CONSTCOND*/0)
+ } while(/*CONSTCOND*/(void)0,0)
#endif /* !TRE_MULTIBYTE */
@@ -132,7 +132,7 @@
str_user_end = str_source->get_next_char(&next_c, &pos_add_next, \
str_source->context); \
} \
- } while(/*CONSTCOND*/0)
+ } while(/*CONSTCOND*/(void)0,0)
#endif /* !TRE_WCHAR */
@@ -161,11 +161,11 @@
#define CHECK_CHAR_CLASSES(trans_i, tnfa, eflags) \
(((trans_i->assertions & ASSERT_CHAR_CLASS) \
&& !(tnfa->cflags & REG_ICASE) \
- && !tre_isctype((tre_cint_t)prev_c, trans_i->u.classt)) \
+ && !tre_isctype((tre_cint_t)prev_c, trans_i->u.class)) \
|| ((trans_i->assertions & ASSERT_CHAR_CLASS) \
&& (tnfa->cflags & REG_ICASE) \
- && !tre_isctype(tre_tolower((tre_cint_t)prev_c),trans_i->u.classt) \
- && !tre_isctype(tre_toupper((tre_cint_t)prev_c),trans_i->u.classt)) \
+ && !tre_isctype(tre_tolower((tre_cint_t)prev_c),trans_i->u.class) \
+ && !tre_isctype(tre_toupper((tre_cint_t)prev_c),trans_i->u.class)) \
|| ((trans_i->assertions & ASSERT_CHAR_CLASS_NEG) \
&& tre_neg_char_classes_match(trans_i->neg_classes,(tre_cint_t)prev_c,\
tnfa->cflags & REG_ICASE)))
diff --git a/src/extra/tre/tre-mem.c b/src/extra/tre/tre-mem.c
index 51b630c..67ba676 100644
--- a/src/extra/tre/tre-mem.c
+++ b/src/extra/tre/tre-mem.c
@@ -111,8 +111,8 @@ tre_mem_alloc_impl(tre_mem_t mem, int provided, void *provided_block,
block_size = size * 8;
else
block_size = TRE_MEM_BLOCK_SIZE;
- DPRINT(("tre_mem_alloc: allocating new %u byte block\n",
- (unsigned int)block_size));
+ DPRINT(("tre_mem_alloc: allocating new %lu byte block\n",
+ (unsigned long)block_size));
l = xmalloc(sizeof(*l));
if (l == NULL)
{
diff --git a/src/extra/tre/tre-parse.c b/src/extra/tre/tre-parse.c
index 50d0438..86ccad6 100644
--- a/src/extra/tre/tre-parse.c
+++ b/src/extra/tre/tre-parse.c
@@ -123,23 +123,22 @@ tre_new_item(tre_mem_t mem, int min, int max, int *i, int *max_i,
/* Expands a character class to character ranges. */
static reg_errcode_t
-tre_expand_ctype(tre_mem_t mem, tre_ctype_t classt, tre_ast_node_t ***items,
+tre_expand_ctype(tre_mem_t mem, tre_ctype_t class, tre_ast_node_t ***items,
int *i, int *max_i, int cflags)
{
reg_errcode_t status = REG_OK;
tre_cint_t c;
- tre_cint_t j;
- int min = EMPTY, max = 0;
+ int j, min = -1, max = 0;
//assert(TRE_MB_CUR_MAX == 1); It is the ctx->cur_max that matters
DPRINT((" expanding class to character ranges\n"));
for (j = 0; (j < 256) && (status == REG_OK); j++)
{
- c = j;
- if (tre_isctype(c, classt)
+ c = (tre_cint_t) j;
+ if (tre_isctype(c, class)
|| ((cflags & REG_ICASE)
- && (tre_isctype(tre_tolower(c), classt)
- || tre_isctype(tre_toupper(c), classt))))
+ && (tre_isctype(tre_tolower(c), class)
+ || tre_isctype(tre_toupper(c), class))))
{
if (min < 0)
min = c;
@@ -149,7 +148,7 @@ tre_expand_ctype(tre_mem_t mem, tre_ctype_t classt, tre_ast_node_t ***items,
{
DPRINT((" range %c (%d) to %c (%d)\n", min, min, max, max));
status = tre_new_item(mem, min, max, i, max_i, items);
- min = EMPTY;
+ min = -1;
}
}
if (min >= 0 && status == REG_OK)
@@ -164,7 +163,7 @@ tre_compare_items(const void *a, const void *b)
const tre_ast_node_t *node_a = *(tre_ast_node_t * const *)a;
const tre_ast_node_t *node_b = *(tre_ast_node_t * const *)b;
tre_literal_t *l_a = node_a->obj, *l_b = node_b->obj;
- int a_min = l_a->code_min, b_min = l_b->code_min;
+ long a_min = l_a->code_min, b_min = l_b->code_min;
if (a_min < b_min)
return -1;
@@ -255,7 +254,7 @@ tre_parse_bracket_items(tre_parse_ctx_t *ctx, int negate,
{
const tre_char_t *re = ctx->re;
reg_errcode_t status = REG_OK;
- tre_ctype_t classt = (tre_ctype_t)0;
+ tre_ctype_t class = (tre_ctype_t)0;
int i = *num_items;
int max_i = *items_size;
int skip;
@@ -278,7 +277,7 @@ tre_parse_bracket_items(tre_parse_ctx_t *ctx, int negate,
{
tre_cint_t min = 0, max = 0;
- classt = (tre_ctype_t)0;
+ class = (tre_ctype_t)0;
if (re + 2 < ctx->re_end
&& *(re + 1) == CHAR_MINUS && *(re + 2) != CHAR_RBRACKET)
{
@@ -330,15 +329,15 @@ tre_parse_bracket_items(tre_parse_ctx_t *ctx, int negate,
#endif /* !TRE_WCHAR */
tmp_str[len] = '\0';
DPRINT((" class name: %s\n", tmp_str));
- classt = tre_ctype(tmp_str);
- if (!classt)
+ class = tre_ctype(tmp_str);
+ if (!class)
status = REG_ECTYPE;
/* Optimize character classes for 8 bit character sets. */
if (status == REG_OK && ctx->cur_max == 1)
{
- status = tre_expand_ctype(ctx->mem, classt, items,
+ status = tre_expand_ctype(ctx->mem, class, items,
&i, &max_i, ctx->cflags);
- classt = (tre_ctype_t)0;
+ class = (tre_ctype_t)0;
skip = 1;
}
re = endptr + 2;
@@ -361,22 +360,22 @@ tre_parse_bracket_items(tre_parse_ctx_t *ctx, int negate,
if (status != REG_OK)
break;
- if (classt && negate)
+ if (class && negate)
if (*num_neg_classes >= MAX_NEG_CLASSES)
status = REG_ESPACE;
else
- neg_classes[(*num_neg_classes)++] = classt;
+ neg_classes[(*num_neg_classes)++] = class;
else if (!skip)
{
status = tre_new_item(ctx->mem, min, max, &i, &max_i, items);
if (status != REG_OK)
break;
- ((tre_literal_t*)((*items)[i-1])->obj)->u.classt = classt;
+ ((tre_literal_t*)((*items)[i-1])->obj)->u.class = class;
}
/* Add opposite-case counterpoints if REG_ICASE is present.
This is broken if there are more than two "same" characters. */
- if (ctx->cflags & REG_ICASE && !classt && status == REG_OK && !skip)
+ if (ctx->cflags & REG_ICASE && !class && status == REG_OK && !skip)
{
tre_cint_t cmin, ccurr;
@@ -455,11 +454,11 @@ tre_parse_bracket(tre_parse_ctx_t *ctx, tre_ast_node_t **result)
{
int min, max;
tre_literal_t *l = items[j]->obj;
- min = l->code_min;
- max = l->code_max;
+ min = (int) l->code_min;
+ max = (int) l->code_max;
DPRINT(("item: %d - %d, class %p, curr_max = %d\n",
- (int)l->code_min, (int)l->code_max, (void *)l->u.classt, curr_max));
+ (int)l->code_min, (int)l->code_max, (void *)l->u.class, curr_max));
if (negate)
{
@@ -831,7 +830,7 @@ tre_parse_bound(tre_parse_ctx_t *ctx, tre_ast_node_t **result)
/* Create the AST node(s). */
if (min == 0 && max == 0)
{
- *result = tre_ast_new_literal(ctx->mem, EMPTY, EMPTY, -1);
+ *result = tre_ast_new_literal(ctx->mem, EMPTY, -1, -1);
if (*result == NULL)
return REG_ESPACE;
}
@@ -1212,7 +1211,7 @@ tre_parse(tre_parse_ctx_t *ctx)
DPRINT(("tre_parse: extension: '%.*" STRF "\n",
REST(ctx->re)));
ctx->re += 2;
- while (/*CONSTCOND*/1)
+ while (/*CONSTCOND*/(void)1,1)
{
if (*ctx->re == L'i')
{
@@ -1352,7 +1351,7 @@ tre_parse(tre_parse_ctx_t *ctx)
subexpression was closed. POSIX leaves the meaning of
this to be implementation-defined. We interpret this as
an empty expression (which matches an empty string). */
- result = tre_ast_new_literal(ctx->mem, EMPTY, EMPTY, -1);
+ result = tre_ast_new_literal(ctx->mem, EMPTY, -1, -1);
if (result == NULL)
return REG_ESPACE;
if (!(ctx->cflags & REG_EXTENDED))
@@ -1645,7 +1644,7 @@ tre_parse(tre_parse_ctx_t *ctx)
{
DPRINT(("tre_parse: empty: '%.*" STRF "'\n",
REST(ctx->re)));
- result = tre_ast_new_literal(ctx->mem, EMPTY, EMPTY, -1);
+ result = tre_ast_new_literal(ctx->mem, EMPTY, -1, -1);
if (!result)
return REG_ESPACE;
break;
@@ -1715,7 +1714,7 @@ tre_parse(tre_parse_ctx_t *ctx)
if (result->submatch_id >= 0)
{
tre_ast_node_t *n, *tmp_node;
- n = tre_ast_new_literal(ctx->mem, EMPTY, EMPTY, -1);
+ n = tre_ast_new_literal(ctx->mem, EMPTY, -1, -1);
if (n == NULL)
return REG_ESPACE;
tmp_node = tre_ast_new_catenation(ctx->mem, n, result);
diff --git a/src/extra/tre/tre-stack.h b/src/extra/tre/tre-stack.h
index 7d11c5e..a1acbe7 100644
--- a/src/extra/tre/tre-stack.h
+++ b/src/extra/tre/tre-stack.h
@@ -54,7 +54,7 @@ declare_popf(int, int);
{ \
status = tre_stack_push_ ## typetag(s, value); \
} \
- while (/*CONSTCOND*/0)
+ while (/*CONSTCOND*/(void)0,0)
#define STACK_PUSHX(s, typetag, value) \
{ \
diff --git a/src/extra/tre/tre.h b/src/extra/tre/tre.h
index 9d7d3a7..128475d 100644
--- a/src/extra/tre/tre.h
+++ b/src/extra/tre/tre.h
@@ -137,14 +137,6 @@ extern int
tre_regexec(const regex_t *preg, const char *string, size_t nmatch,
regmatch_t pmatch[], int eflags);
-extern size_t
-tre_regerror(int errcode, const regex_t *preg, char *errbuf,
- size_t errbuf_size);
-
-extern void
-tre_regfree(regex_t *preg);
-
-/* R additions */
extern int
tre_regcompb(regex_t *preg, const char *regex, int cflags);
@@ -152,6 +144,13 @@ extern int
tre_regexecb(const regex_t *preg, const char *string, size_t nmatch,
regmatch_t pmatch[], int eflags);
+extern size_t
+tre_regerror(int errcode, const regex_t *preg, char *errbuf,
+ size_t errbuf_size);
+
+extern void
+tre_regfree(regex_t *preg);
+
#ifdef TRE_WCHAR
#ifdef HAVE_WCHAR_H
#include <wchar.h>
@@ -223,7 +222,10 @@ extern int
tre_regaexec(const regex_t *preg, const char *string,
regamatch_t *match, regaparams_t params, int eflags);
-/* R addition */
+extern int
+tre_reganexec(const regex_t *preg, const char *string, size_t len,
+ regamatch_t *match, regaparams_t params, int eflags);
+
extern int
tre_regaexecb(const regex_t *preg, const char *string,
regamatch_t *match, regaparams_t params, int eflags);
@@ -279,8 +281,7 @@ enum {
TRE_CONFIG_WCHAR,
TRE_CONFIG_MULTIBYTE,
TRE_CONFIG_SYSTEM_ABI,
- TRE_CONFIG_VERSION,
- TRE_MB_CUR_MAX_VALUE /* [i_a] - derived from MULTIBYTE and WCHAR, but still handy to have: no need to copy logic in TRE header files, etc. in order to know this */
+ TRE_CONFIG_VERSION
};
/* Returns 1 if the compiled pattern has back references, 0 if not. */

View file

@ -0,0 +1,709 @@
diff --git a/configure b/configure
index b3c299e..01f205d 100755
--- a/configure
+++ b/configure
@@ -5193,6 +5193,7 @@ elif test ${makeinfo_version_maj} -lt 4 \
else
r_cv_prog_makeinfo_v4=yes
fi
+r_cv_prog_makeinfo_v4=yes
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $r_cv_prog_makeinfo_v4" >&5
$as_echo "$r_cv_prog_makeinfo_v4" >&6; }
diff --git a/src/extra/tre/regcomp.c b/src/extra/tre/regcomp.c
index 93ddb92..31d4e52 100644
--- a/src/extra/tre/regcomp.c
+++ b/src/extra/tre/regcomp.c
@@ -99,7 +99,6 @@ tre_regncomp(regex_t *preg, const char *regex, size_t n, int cflags)
return ret;
}
-
/* this version takes bytes literally, to be used with raw vectors */
int
tre_regncompb(regex_t *preg, const char *regex, size_t n, int cflags)
@@ -131,7 +130,6 @@ tre_regcomp(regex_t *preg, const char *regex, int cflags)
return tre_regncomp(preg, regex, regex ? strlen(regex) : 0, cflags);
}
-/* R addition */
int
tre_regcompb(regex_t *preg, const char *regex, int cflags)
{
diff --git a/src/extra/tre/regexec.c b/src/extra/tre/regexec.c
index 6edaf81..d8f91a3 100644
--- a/src/extra/tre/regexec.c
+++ b/src/extra/tre/regexec.c
@@ -217,7 +217,6 @@ tre_regexec(const regex_t *preg, const char *str,
return tre_regnexec(preg, str, (unsigned)-1, nmatch, pmatch, eflags);
}
-/* R addition */
int
tre_regexecb(const regex_t *preg, const char *str,
size_t nmatch, regmatch_t pmatch[], int eflags)
@@ -329,7 +328,6 @@ tre_regaexec(const regex_t *preg, const char *str,
return tre_reganexec(preg, str, (unsigned)-1, match, params, eflags);
}
-/* R addition */
int
tre_regaexecb(const regex_t *preg, const char *str,
regamatch_t *match, regaparams_t params, int eflags)
diff --git a/src/extra/tre/tre-ast.h b/src/extra/tre/tre-ast.h
index 844aee3..d9af376 100644
--- a/src/extra/tre/tre-ast.h
+++ b/src/extra/tre/tre-ast.h
@@ -55,16 +55,11 @@ typedef struct {
tags, matching parameter settings, and all expressions that match one
character. */
typedef struct {
-#if 0 /* [i_a] must be able to carry the full span of all [Unicode] character codes *PLUS* these 'specials': TAG, PARAMETER, BACKREF, ASSERTION and EMPTY */
- tre_cint_t code_min;
- tre_cint_t code_max;
-#else
- int /* long */ code_min;
- int /* long */ code_max;
-#endif
+ long code_min;
+ long code_max;
int position;
union {
- tre_ctype_t classt; /* [i_a] wrong syntax colouring prevention */
+ tre_ctype_t class;
int *params;
} u;
tre_ctype_t *neg_classes;
diff --git a/src/extra/tre/tre-compile.c b/src/extra/tre/tre-compile.c
index 7886455..92c14ab 100644
--- a/src/extra/tre/tre-compile.c
+++ b/src/extra/tre/tre-compile.c
@@ -6,6 +6,13 @@
*/
+/*
+ TODO:
+ - Fix tre_ast_to_tnfa() to recurse using a stack instead of recursive
+ function calls.
+*/
+
+
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif /* HAVE_CONFIG_H */
@@ -684,8 +691,8 @@ tre_copy_ast(tre_mem_t mem, tre_stack_t *stack, tre_ast_node_t *ast,
{
tre_literal_t *lit = node->obj;
int pos = lit->position;
- int min = lit->code_min;
- int max = lit->code_max;
+ int min = (int)lit->code_min;
+ int max = (int)lit->code_max;
if (!IS_SPECIAL(lit) || IS_BACKREF(lit))
{
/* XXX - e.g. [ab] has only one position but two
@@ -945,7 +952,7 @@ tre_expand_ast(tre_mem_t mem, tre_stack_t *stack, tre_ast_node_t *ast,
seq2 = copy;
if (seq2 == NULL)
return REG_ESPACE;
- tmp = tre_ast_new_literal(mem, EMPTY, EMPTY, -1);
+ tmp = tre_ast_new_literal(mem, EMPTY, -1, -1);
if (tmp == NULL)
return REG_ESPACE;
seq2 = tre_ast_new_union(mem, tmp, seq2);
@@ -1052,15 +1059,15 @@ tre_set_empty(tre_mem_t mem)
return NULL;
new_set[0].position = -1;
- new_set[0].code_min = EMPTY;
- new_set[0].code_max = EMPTY;
+ new_set[0].code_min = -1;
+ new_set[0].code_max = -1;
return new_set;
}
static tre_pos_and_tags_t *
tre_set_one(tre_mem_t mem, int position, int code_min, int code_max,
- tre_ctype_t classt, tre_ctype_t *neg_classes, int backref)
+ tre_ctype_t class, tre_ctype_t *neg_classes, int backref)
{
tre_pos_and_tags_t *new_set;
@@ -1071,12 +1078,12 @@ tre_set_one(tre_mem_t mem, int position, int code_min, int code_max,
new_set[0].position = position;
new_set[0].code_min = code_min;
new_set[0].code_max = code_max;
- new_set[0].classt = classt;
+ new_set[0].class = class;
new_set[0].neg_classes = neg_classes;
new_set[0].backref = backref;
new_set[1].position = -1;
- new_set[1].code_min = EMPTY;
- new_set[1].code_max = EMPTY;
+ new_set[1].code_min = -1;
+ new_set[1].code_max = -1;
return new_set;
}
@@ -1103,7 +1110,7 @@ tre_set_union(tre_mem_t mem, tre_pos_and_tags_t *set1, tre_pos_and_tags_t *set2,
new_set[s1].code_min = set1[s1].code_min;
new_set[s1].code_max = set1[s1].code_max;
new_set[s1].assertions = set1[s1].assertions | assertions;
- new_set[s1].classt = set1[s1].classt;
+ new_set[s1].class = set1[s1].class;
new_set[s1].neg_classes = set1[s1].neg_classes;
new_set[s1].backref = set1[s1].backref;
if (set1[s1].tags == NULL && tags == NULL)
@@ -1148,7 +1155,7 @@ tre_set_union(tre_mem_t mem, tre_pos_and_tags_t *set1, tre_pos_and_tags_t *set2,
new_set[s1 + s2].code_max = set2[s2].code_max;
/* XXX - why not | assertions here as well? */
new_set[s1 + s2].assertions = set2[s2].assertions;
- new_set[s1 + s2].classt = set2[s2].classt;
+ new_set[s1 + s2].class = set2[s2].class;
new_set[s1 + s2].neg_classes = set2[s2].neg_classes;
new_set[s1 + s2].backref = set2[s2].backref;
if (set2[s2].tags == NULL)
@@ -1231,7 +1238,7 @@ tre_match_empty(tre_stack_t *stack, tre_ast_node_t *node, int *tags,
break;
if (tags[i] < 0)
{
- tags[i] = lit->code_max;
+ tags[i] = (int)lit->code_max;
tags[i + 1] = -1;
}
}
@@ -1373,7 +1380,7 @@ tre_compute_nfl(tre_mem_t mem, tre_stack_t *stack, tre_ast_node_t *tree)
node->lastpos = tre_set_one(mem, lit->position,
(int)lit->code_min,
(int)lit->code_max,
- lit->u.classt, lit->neg_classes,
+ lit->u.class, lit->neg_classes,
-1);
if (!node->lastpos)
return REG_ESPACE;
@@ -1614,12 +1621,12 @@ tre_make_trans(tre_pos_and_tags_t *p1, tre_pos_and_tags_t *p2,
(trans + 1)->state = NULL;
/* Use the character ranges, assertions, etc. from `p1' for
the transition from `p1' to `p2'. */
- trans->code_min = p1->code_min;
- trans->code_max = p1->code_max;
+ trans->code_min = (tre_cint_t) p1->code_min;
+ trans->code_max = (tre_cint_t) p1->code_max;
trans->state = transitions + offs[p2->position];
trans->state_id = p2->position;
trans->assertions = p1->assertions | p2->assertions
- | (p1->classt ? ASSERT_CHAR_CLASS : 0)
+ | (p1->class ? ASSERT_CHAR_CLASS : 0)
| (p1->neg_classes != NULL ? ASSERT_CHAR_CLASS_NEG : 0);
if (p1->backref >= 0)
{
@@ -1629,7 +1636,7 @@ tre_make_trans(tre_pos_and_tags_t *p1, tre_pos_and_tags_t *p2,
trans->assertions |= ASSERT_BACKREF;
}
else
- trans->u.classt = p1->classt;
+ trans->u.class = p1->class;
if (p1->neg_classes != NULL)
{
for (i = 0; p1->neg_classes[i] != (tre_ctype_t)0; i++);
@@ -1743,8 +1750,8 @@ tre_make_trans(tre_pos_and_tags_t *p1, tre_pos_and_tags_t *p2,
DPRINT((", assert %d", trans->assertions));
if (trans->assertions & ASSERT_BACKREF)
DPRINT((", backref %d", trans->u.backref));
- else if (trans->u.classt)
- DPRINT((", class %ld", (long)trans->u.classt));
+ else if (trans->u.class)
+ DPRINT((", class %ld", (long)trans->u.class));
if (trans->neg_classes)
DPRINT((", neg_classes %p", trans->neg_classes));
if (trans->params)
@@ -1861,10 +1868,10 @@ tre_ast_to_tnfa(tre_ast_node_t *node, tre_tnfa_transition_t *transitions,
do \
{ \
errcode = err; \
- if (/*CONSTCOND*/1) \
+ if (/*CONSTCOND*/(void)1,1) \
goto error_exit; \
} \
- while (/*CONSTCOND*/0)
+ while (/*CONSTCOND*/(void)0,0)
int
@@ -2050,7 +2057,7 @@ tre_compile(regex_t *preg, const tre_char_t *regex, size_t n, int cflags)
if (TRE_MB_CUR_MAX == 1 && !tmp_ast_l->nullable)
{
int count = 0;
- int k; /* [i_a] */
+ tre_cint_t k;
DPRINT(("Characters that can start a match:"));
tnfa->firstpos_chars = xcalloc(256, sizeof(char));
if (tnfa->firstpos_chars == NULL)
@@ -2310,15 +2317,7 @@ tre_config(int query, void *result)
case TRE_CONFIG_VERSION:
*string_result = TRE_VERSION;
return REG_OK;
-
- case TRE_MB_CUR_MAX_VALUE: /* [i_a] */
-#if defined(TRE_MB_CUR_MAX)
- *int_result = TRE_MB_CUR_MAX;
-#else
- *int_result = 1;
-#endif
- break;
- }
+ }
return REG_NOMATCH;
}
diff --git a/src/extra/tre/tre-compile.h b/src/extra/tre/tre-compile.h
index 0d81cf2..51d5ac9 100644
--- a/src/extra/tre/tre-compile.h
+++ b/src/extra/tre/tre-compile.h
@@ -12,16 +12,11 @@
typedef struct {
int position;
-#if 0 /* [i_a] must be able to carry the full span of all [Unicode] character codes *PLUS* these 'specials': TAG, PARAMETER, BACKREF, ASSERTION and EMPTY */
- tre_cint_t code_min;
- tre_cint_t code_max;
-#else
int code_min;
int code_max;
-#endif
int *tags;
int assertions;
- tre_ctype_t classt;
+ tre_ctype_t class;
tre_ctype_t *neg_classes;
int backref;
int *params;
diff --git a/src/extra/tre/tre-internal.h b/src/extra/tre/tre-internal.h
index c1300ac..822998e 100644
--- a/src/extra/tre/tre-internal.h
+++ b/src/extra/tre/tre-internal.h
@@ -22,9 +22,9 @@
#ifdef TRE_DEBUG
#include <stdio.h>
-#define DPRINT(msg) do {printf msg; fflush(stdout);} while(/*CONSTCOND*/0)
+#define DPRINT(msg) do {printf msg; fflush(stdout);} while(/*CONSTCOND*/(void)0,0)
#else /* !TRE_DEBUG */
-#define DPRINT(msg) do { } while(/*CONSTCOND*/0)
+#define DPRINT(msg) do { } while(/*CONSTCOND*/(void)0,0)
#endif /* !TRE_DEBUG */
#define elementsof(x) ( sizeof(x) / sizeof(x[0]) )
@@ -151,13 +151,8 @@ typedef struct tnfa_transition tre_tnfa_transition_t;
struct tnfa_transition {
/* Range of accepted characters. */
-#if 0 /* [i_a] must be able to carry the full span of all [Unicode] character codes *PLUS* these 'specials': TAG, PARAMETER, BACKREF, ASSERTION and EMPTY */
tre_cint_t code_min;
tre_cint_t code_max;
-#else
- int code_min;
- int code_max;
-#endif
/* Pointer to the destination state. */
tre_tnfa_transition_t *state;
/* ID number of the destination state. */
@@ -171,7 +166,7 @@ struct tnfa_transition {
/* Assertion parameters. */
union {
/* Character class assertion. */
- tre_ctype_t classt;
+ tre_ctype_t class;
/* Back reference assertion. */
int backref;
} u;
diff --git a/src/extra/tre/tre-match-approx.c b/src/extra/tre/tre-match-approx.c
index 6011114..f08cd0f 100644
--- a/src/extra/tre/tre-match-approx.c
+++ b/src/extra/tre/tre-match-approx.c
@@ -328,7 +328,7 @@ tre_tnfa_run_approx(const tre_tnfa_t *tnfa, const void *string, int len,
GET_NEXT_WCHAR();
pos = 0;
- while (/*CONSTCOND*/1)
+ while (/*CONSTCOND*/(void)1,1)
{
DPRINT(("%03d:%2lc/%05d\n", pos, (tre_cint_t)next_c, (int)next_c));
diff --git a/src/extra/tre/tre-match-backtrack.c b/src/extra/tre/tre-match-backtrack.c
index 9630e81..9dd7e94 100644
--- a/src/extra/tre/tre-match-backtrack.c
+++ b/src/extra/tre/tre-match-backtrack.c
@@ -116,7 +116,7 @@ typedef struct tre_backtrack_struct {
#ifdef TRE_USE_ALLOCA
#define tre_bt_mem_new tre_mem_newa
#define tre_bt_mem_alloc tre_mem_alloca
-#define tre_bt_mem_destroy(obj) do { } while (0)
+#define tre_bt_mem_destroy(obj) do { } while (0,0)
#else /* !TRE_USE_ALLOCA */
#define tre_bt_mem_new tre_mem_new
#define tre_bt_mem_alloc tre_mem_alloc
@@ -173,7 +173,7 @@ typedef struct tre_backtrack_struct {
stack->item.tags[i] = (_tags)[i]; \
BT_STACK_MBSTATE_IN; \
} \
- while (/*CONSTCOND*/0)
+ while (/*CONSTCOND*/(void)0,0)
#define BT_STACK_POP() \
do \
@@ -186,13 +186,13 @@ typedef struct tre_backtrack_struct {
str_byte = stack->item.str_byte; \
BT_STACK_WIDE_OUT; \
state = stack->item.state; \
- next_c = (tre_char_t)stack->item.next_c; \
+ next_c = (tre_char_t) stack->item.next_c; \
for (i = 0; i < tnfa->num_tags; i++) \
tags[i] = stack->item.tags[i]; \
BT_STACK_MBSTATE_OUT; \
stack = stack->prev; \
} \
- while (/*CONSTCOND*/0)
+ while (/*CONSTCOND*/(void)0,0)
#undef MIN
#define MIN(a, b) ((a) <= (b) ? (a) : (b))
@@ -372,7 +372,7 @@ tre_tnfa_run_backtrack(const tre_tnfa_t *tnfa, const void *string,
if (state == NULL)
goto backtrack;
- while (/*CONSTCOND*/1)
+ while (/*CONSTCOND*/(void)1,1)
{
tre_tnfa_transition_t *next_state;
int empty_br_match;
@@ -632,7 +632,7 @@ tre_tnfa_run_backtrack(const tre_tnfa_t *tnfa, const void *string,
}
}
DPRINT(("restarting from next start position\n"));
- next_c = (tre_char_t)next_c_start;
+ next_c = (tre_char_t) next_c_start;
#ifdef TRE_MBSTATE
mbstate = mbstate_start;
#endif /* TRE_MBSTATE */
diff --git a/src/extra/tre/tre-match-parallel.c b/src/extra/tre/tre-match-parallel.c
index ddb9fda..6696d11 100644
--- a/src/extra/tre/tre-match-parallel.c
+++ b/src/extra/tre/tre-match-parallel.c
@@ -269,7 +269,7 @@ tre_tnfa_run_parallel(const tre_tnfa_t *tnfa, const void *string, int len,
DPRINT(("-------------+------------------------------------------------\n"));
reach_next_i = reach_next;
- while (/*CONSTCOND*/1)
+ while (/*CONSTCOND*/(void)1,1)
{
/* If no match found yet, add the initial states to `reach_next'. */
if (match_eo < 0)
diff --git a/src/extra/tre/tre-match-utils.h b/src/extra/tre/tre-match-utils.h
index 7d19c21..d0a4214 100644
--- a/src/extra/tre/tre-match-utils.h
+++ b/src/extra/tre/tre-match-utils.h
@@ -76,7 +76,7 @@
str_user_end = str_source->get_next_char(&next_c, &pos_add_next, \
str_source->context); \
} \
- } while(/*CONSTCOND*/0)
+ } while(/*CONSTCOND*/(void)0,0)
#else /* !TRE_MULTIBYTE */
@@ -107,7 +107,7 @@
str_user_end = str_source->get_next_char(&next_c, &pos_add_next, \
str_source->context); \
} \
- } while(/*CONSTCOND*/0)
+ } while(/*CONSTCOND*/(void)0,0)
#endif /* !TRE_MULTIBYTE */
@@ -132,7 +132,7 @@
str_user_end = str_source->get_next_char(&next_c, &pos_add_next, \
str_source->context); \
} \
- } while(/*CONSTCOND*/0)
+ } while(/*CONSTCOND*/(void)0,0)
#endif /* !TRE_WCHAR */
@@ -161,11 +161,11 @@
#define CHECK_CHAR_CLASSES(trans_i, tnfa, eflags) \
(((trans_i->assertions & ASSERT_CHAR_CLASS) \
&& !(tnfa->cflags & REG_ICASE) \
- && !tre_isctype((tre_cint_t)prev_c, trans_i->u.classt)) \
+ && !tre_isctype((tre_cint_t)prev_c, trans_i->u.class)) \
|| ((trans_i->assertions & ASSERT_CHAR_CLASS) \
&& (tnfa->cflags & REG_ICASE) \
- && !tre_isctype(tre_tolower((tre_cint_t)prev_c),trans_i->u.classt) \
- && !tre_isctype(tre_toupper((tre_cint_t)prev_c),trans_i->u.classt)) \
+ && !tre_isctype(tre_tolower((tre_cint_t)prev_c),trans_i->u.class) \
+ && !tre_isctype(tre_toupper((tre_cint_t)prev_c),trans_i->u.class)) \
|| ((trans_i->assertions & ASSERT_CHAR_CLASS_NEG) \
&& tre_neg_char_classes_match(trans_i->neg_classes,(tre_cint_t)prev_c,\
tnfa->cflags & REG_ICASE)))
diff --git a/src/extra/tre/tre-mem.c b/src/extra/tre/tre-mem.c
index 51b630c..67ba676 100644
--- a/src/extra/tre/tre-mem.c
+++ b/src/extra/tre/tre-mem.c
@@ -111,8 +111,8 @@ tre_mem_alloc_impl(tre_mem_t mem, int provided, void *provided_block,
block_size = size * 8;
else
block_size = TRE_MEM_BLOCK_SIZE;
- DPRINT(("tre_mem_alloc: allocating new %u byte block\n",
- (unsigned int)block_size));
+ DPRINT(("tre_mem_alloc: allocating new %lu byte block\n",
+ (unsigned long)block_size));
l = xmalloc(sizeof(*l));
if (l == NULL)
{
diff --git a/src/extra/tre/tre-parse.c b/src/extra/tre/tre-parse.c
index 50d0438..86ccad6 100644
--- a/src/extra/tre/tre-parse.c
+++ b/src/extra/tre/tre-parse.c
@@ -123,23 +123,22 @@ tre_new_item(tre_mem_t mem, int min, int max, int *i, int *max_i,
/* Expands a character class to character ranges. */
static reg_errcode_t
-tre_expand_ctype(tre_mem_t mem, tre_ctype_t classt, tre_ast_node_t ***items,
+tre_expand_ctype(tre_mem_t mem, tre_ctype_t class, tre_ast_node_t ***items,
int *i, int *max_i, int cflags)
{
reg_errcode_t status = REG_OK;
tre_cint_t c;
- tre_cint_t j;
- int min = EMPTY, max = 0;
+ int j, min = -1, max = 0;
//assert(TRE_MB_CUR_MAX == 1); It is the ctx->cur_max that matters
DPRINT((" expanding class to character ranges\n"));
for (j = 0; (j < 256) && (status == REG_OK); j++)
{
- c = j;
- if (tre_isctype(c, classt)
+ c = (tre_cint_t) j;
+ if (tre_isctype(c, class)
|| ((cflags & REG_ICASE)
- && (tre_isctype(tre_tolower(c), classt)
- || tre_isctype(tre_toupper(c), classt))))
+ && (tre_isctype(tre_tolower(c), class)
+ || tre_isctype(tre_toupper(c), class))))
{
if (min < 0)
min = c;
@@ -149,7 +148,7 @@ tre_expand_ctype(tre_mem_t mem, tre_ctype_t classt, tre_ast_node_t ***items,
{
DPRINT((" range %c (%d) to %c (%d)\n", min, min, max, max));
status = tre_new_item(mem, min, max, i, max_i, items);
- min = EMPTY;
+ min = -1;
}
}
if (min >= 0 && status == REG_OK)
@@ -164,7 +163,7 @@ tre_compare_items(const void *a, const void *b)
const tre_ast_node_t *node_a = *(tre_ast_node_t * const *)a;
const tre_ast_node_t *node_b = *(tre_ast_node_t * const *)b;
tre_literal_t *l_a = node_a->obj, *l_b = node_b->obj;
- int a_min = l_a->code_min, b_min = l_b->code_min;
+ long a_min = l_a->code_min, b_min = l_b->code_min;
if (a_min < b_min)
return -1;
@@ -255,7 +254,7 @@ tre_parse_bracket_items(tre_parse_ctx_t *ctx, int negate,
{
const tre_char_t *re = ctx->re;
reg_errcode_t status = REG_OK;
- tre_ctype_t classt = (tre_ctype_t)0;
+ tre_ctype_t class = (tre_ctype_t)0;
int i = *num_items;
int max_i = *items_size;
int skip;
@@ -278,7 +277,7 @@ tre_parse_bracket_items(tre_parse_ctx_t *ctx, int negate,
{
tre_cint_t min = 0, max = 0;
- classt = (tre_ctype_t)0;
+ class = (tre_ctype_t)0;
if (re + 2 < ctx->re_end
&& *(re + 1) == CHAR_MINUS && *(re + 2) != CHAR_RBRACKET)
{
@@ -330,15 +329,15 @@ tre_parse_bracket_items(tre_parse_ctx_t *ctx, int negate,
#endif /* !TRE_WCHAR */
tmp_str[len] = '\0';
DPRINT((" class name: %s\n", tmp_str));
- classt = tre_ctype(tmp_str);
- if (!classt)
+ class = tre_ctype(tmp_str);
+ if (!class)
status = REG_ECTYPE;
/* Optimize character classes for 8 bit character sets. */
if (status == REG_OK && ctx->cur_max == 1)
{
- status = tre_expand_ctype(ctx->mem, classt, items,
+ status = tre_expand_ctype(ctx->mem, class, items,
&i, &max_i, ctx->cflags);
- classt = (tre_ctype_t)0;
+ class = (tre_ctype_t)0;
skip = 1;
}
re = endptr + 2;
@@ -361,22 +360,22 @@ tre_parse_bracket_items(tre_parse_ctx_t *ctx, int negate,
if (status != REG_OK)
break;
- if (classt && negate)
+ if (class && negate)
if (*num_neg_classes >= MAX_NEG_CLASSES)
status = REG_ESPACE;
else
- neg_classes[(*num_neg_classes)++] = classt;
+ neg_classes[(*num_neg_classes)++] = class;
else if (!skip)
{
status = tre_new_item(ctx->mem, min, max, &i, &max_i, items);
if (status != REG_OK)
break;
- ((tre_literal_t*)((*items)[i-1])->obj)->u.classt = classt;
+ ((tre_literal_t*)((*items)[i-1])->obj)->u.class = class;
}
/* Add opposite-case counterpoints if REG_ICASE is present.
This is broken if there are more than two "same" characters. */
- if (ctx->cflags & REG_ICASE && !classt && status == REG_OK && !skip)
+ if (ctx->cflags & REG_ICASE && !class && status == REG_OK && !skip)
{
tre_cint_t cmin, ccurr;
@@ -455,11 +454,11 @@ tre_parse_bracket(tre_parse_ctx_t *ctx, tre_ast_node_t **result)
{
int min, max;
tre_literal_t *l = items[j]->obj;
- min = l->code_min;
- max = l->code_max;
+ min = (int) l->code_min;
+ max = (int) l->code_max;
DPRINT(("item: %d - %d, class %p, curr_max = %d\n",
- (int)l->code_min, (int)l->code_max, (void *)l->u.classt, curr_max));
+ (int)l->code_min, (int)l->code_max, (void *)l->u.class, curr_max));
if (negate)
{
@@ -831,7 +830,7 @@ tre_parse_bound(tre_parse_ctx_t *ctx, tre_ast_node_t **result)
/* Create the AST node(s). */
if (min == 0 && max == 0)
{
- *result = tre_ast_new_literal(ctx->mem, EMPTY, EMPTY, -1);
+ *result = tre_ast_new_literal(ctx->mem, EMPTY, -1, -1);
if (*result == NULL)
return REG_ESPACE;
}
@@ -1212,7 +1211,7 @@ tre_parse(tre_parse_ctx_t *ctx)
DPRINT(("tre_parse: extension: '%.*" STRF "\n",
REST(ctx->re)));
ctx->re += 2;
- while (/*CONSTCOND*/1)
+ while (/*CONSTCOND*/(void)1,1)
{
if (*ctx->re == L'i')
{
@@ -1352,7 +1351,7 @@ tre_parse(tre_parse_ctx_t *ctx)
subexpression was closed. POSIX leaves the meaning of
this to be implementation-defined. We interpret this as
an empty expression (which matches an empty string). */
- result = tre_ast_new_literal(ctx->mem, EMPTY, EMPTY, -1);
+ result = tre_ast_new_literal(ctx->mem, EMPTY, -1, -1);
if (result == NULL)
return REG_ESPACE;
if (!(ctx->cflags & REG_EXTENDED))
@@ -1645,7 +1644,7 @@ tre_parse(tre_parse_ctx_t *ctx)
{
DPRINT(("tre_parse: empty: '%.*" STRF "'\n",
REST(ctx->re)));
- result = tre_ast_new_literal(ctx->mem, EMPTY, EMPTY, -1);
+ result = tre_ast_new_literal(ctx->mem, EMPTY, -1, -1);
if (!result)
return REG_ESPACE;
break;
@@ -1715,7 +1714,7 @@ tre_parse(tre_parse_ctx_t *ctx)
if (result->submatch_id >= 0)
{
tre_ast_node_t *n, *tmp_node;
- n = tre_ast_new_literal(ctx->mem, EMPTY, EMPTY, -1);
+ n = tre_ast_new_literal(ctx->mem, EMPTY, -1, -1);
if (n == NULL)
return REG_ESPACE;
tmp_node = tre_ast_new_catenation(ctx->mem, n, result);
diff --git a/src/extra/tre/tre-stack.h b/src/extra/tre/tre-stack.h
index 7d11c5e..a1acbe7 100644
--- a/src/extra/tre/tre-stack.h
+++ b/src/extra/tre/tre-stack.h
@@ -54,7 +54,7 @@ declare_popf(int, int);
{ \
status = tre_stack_push_ ## typetag(s, value); \
} \
- while (/*CONSTCOND*/0)
+ while (/*CONSTCOND*/(void)0,0)
#define STACK_PUSHX(s, typetag, value) \
{ \
diff --git a/src/extra/tre/tre.h b/src/extra/tre/tre.h
index 9d7d3a7..128475d 100644
--- a/src/extra/tre/tre.h
+++ b/src/extra/tre/tre.h
@@ -137,14 +137,6 @@ extern int
tre_regexec(const regex_t *preg, const char *string, size_t nmatch,
regmatch_t pmatch[], int eflags);
-extern size_t
-tre_regerror(int errcode, const regex_t *preg, char *errbuf,
- size_t errbuf_size);
-
-extern void
-tre_regfree(regex_t *preg);
-
-/* R additions */
extern int
tre_regcompb(regex_t *preg, const char *regex, int cflags);
@@ -152,6 +144,13 @@ extern int
tre_regexecb(const regex_t *preg, const char *string, size_t nmatch,
regmatch_t pmatch[], int eflags);
+extern size_t
+tre_regerror(int errcode, const regex_t *preg, char *errbuf,
+ size_t errbuf_size);
+
+extern void
+tre_regfree(regex_t *preg);
+
#ifdef TRE_WCHAR
#ifdef HAVE_WCHAR_H
#include <wchar.h>
@@ -223,7 +222,10 @@ extern int
tre_regaexec(const regex_t *preg, const char *string,
regamatch_t *match, regaparams_t params, int eflags);
-/* R addition */
+extern int
+tre_reganexec(const regex_t *preg, const char *string, size_t len,
+ regamatch_t *match, regaparams_t params, int eflags);
+
extern int
tre_regaexecb(const regex_t *preg, const char *string,
regamatch_t *match, regaparams_t params, int eflags);
@@ -279,8 +281,7 @@ enum {
TRE_CONFIG_WCHAR,
TRE_CONFIG_MULTIBYTE,
TRE_CONFIG_SYSTEM_ABI,
- TRE_CONFIG_VERSION,
- TRE_MB_CUR_MAX_VALUE /* [i_a] - derived from MULTIBYTE and WCHAR, but still handy to have: no need to copy logic in TRE header files, etc. in order to know this */
+ TRE_CONFIG_VERSION
};
/* Returns 1 if the compiled pattern has back references, 0 if not. */

View file

@ -0,0 +1,709 @@
diff --git a/configure b/configure
index b3c299e..01f205d 100755
--- a/configure
+++ b/configure
@@ -5193,6 +5193,7 @@ elif test ${makeinfo_version_maj} -lt 4 \
else
r_cv_prog_makeinfo_v4=yes
fi
+r_cv_prog_makeinfo_v4=yes
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $r_cv_prog_makeinfo_v4" >&5
$as_echo "$r_cv_prog_makeinfo_v4" >&6; }
diff --git a/src/extra/tre/regcomp.c b/src/extra/tre/regcomp.c
index 93ddb92..31d4e52 100644
--- a/src/extra/tre/regcomp.c
+++ b/src/extra/tre/regcomp.c
@@ -99,7 +99,6 @@ tre_regncomp(regex_t *preg, const char *regex, size_t n, int cflags)
return ret;
}
-
/* this version takes bytes literally, to be used with raw vectors */
int
tre_regncompb(regex_t *preg, const char *regex, size_t n, int cflags)
@@ -131,7 +130,6 @@ tre_regcomp(regex_t *preg, const char *regex, int cflags)
return tre_regncomp(preg, regex, regex ? strlen(regex) : 0, cflags);
}
-/* R addition */
int
tre_regcompb(regex_t *preg, const char *regex, int cflags)
{
diff --git a/src/extra/tre/regexec.c b/src/extra/tre/regexec.c
index 6edaf81..d8f91a3 100644
--- a/src/extra/tre/regexec.c
+++ b/src/extra/tre/regexec.c
@@ -217,7 +217,6 @@ tre_regexec(const regex_t *preg, const char *str,
return tre_regnexec(preg, str, (unsigned)-1, nmatch, pmatch, eflags);
}
-/* R addition */
int
tre_regexecb(const regex_t *preg, const char *str,
size_t nmatch, regmatch_t pmatch[], int eflags)
@@ -329,7 +328,6 @@ tre_regaexec(const regex_t *preg, const char *str,
return tre_reganexec(preg, str, (unsigned)-1, match, params, eflags);
}
-/* R addition */
int
tre_regaexecb(const regex_t *preg, const char *str,
regamatch_t *match, regaparams_t params, int eflags)
diff --git a/src/extra/tre/tre-ast.h b/src/extra/tre/tre-ast.h
index 844aee3..d9af376 100644
--- a/src/extra/tre/tre-ast.h
+++ b/src/extra/tre/tre-ast.h
@@ -55,16 +55,11 @@ typedef struct {
tags, matching parameter settings, and all expressions that match one
character. */
typedef struct {
-#if 0 /* [i_a] must be able to carry the full span of all [Unicode] character codes *PLUS* these 'specials': TAG, PARAMETER, BACKREF, ASSERTION and EMPTY */
- tre_cint_t code_min;
- tre_cint_t code_max;
-#else
- int /* long */ code_min;
- int /* long */ code_max;
-#endif
+ long code_min;
+ long code_max;
int position;
union {
- tre_ctype_t classt; /* [i_a] wrong syntax colouring prevention */
+ tre_ctype_t class;
int *params;
} u;
tre_ctype_t *neg_classes;
diff --git a/src/extra/tre/tre-compile.c b/src/extra/tre/tre-compile.c
index 7886455..92c14ab 100644
--- a/src/extra/tre/tre-compile.c
+++ b/src/extra/tre/tre-compile.c
@@ -6,6 +6,13 @@
*/
+/*
+ TODO:
+ - Fix tre_ast_to_tnfa() to recurse using a stack instead of recursive
+ function calls.
+*/
+
+
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif /* HAVE_CONFIG_H */
@@ -684,8 +691,8 @@ tre_copy_ast(tre_mem_t mem, tre_stack_t *stack, tre_ast_node_t *ast,
{
tre_literal_t *lit = node->obj;
int pos = lit->position;
- int min = lit->code_min;
- int max = lit->code_max;
+ int min = (int)lit->code_min;
+ int max = (int)lit->code_max;
if (!IS_SPECIAL(lit) || IS_BACKREF(lit))
{
/* XXX - e.g. [ab] has only one position but two
@@ -945,7 +952,7 @@ tre_expand_ast(tre_mem_t mem, tre_stack_t *stack, tre_ast_node_t *ast,
seq2 = copy;
if (seq2 == NULL)
return REG_ESPACE;
- tmp = tre_ast_new_literal(mem, EMPTY, EMPTY, -1);
+ tmp = tre_ast_new_literal(mem, EMPTY, -1, -1);
if (tmp == NULL)
return REG_ESPACE;
seq2 = tre_ast_new_union(mem, tmp, seq2);
@@ -1052,15 +1059,15 @@ tre_set_empty(tre_mem_t mem)
return NULL;
new_set[0].position = -1;
- new_set[0].code_min = EMPTY;
- new_set[0].code_max = EMPTY;
+ new_set[0].code_min = -1;
+ new_set[0].code_max = -1;
return new_set;
}
static tre_pos_and_tags_t *
tre_set_one(tre_mem_t mem, int position, int code_min, int code_max,
- tre_ctype_t classt, tre_ctype_t *neg_classes, int backref)
+ tre_ctype_t class, tre_ctype_t *neg_classes, int backref)
{
tre_pos_and_tags_t *new_set;
@@ -1071,12 +1078,12 @@ tre_set_one(tre_mem_t mem, int position, int code_min, int code_max,
new_set[0].position = position;
new_set[0].code_min = code_min;
new_set[0].code_max = code_max;
- new_set[0].classt = classt;
+ new_set[0].class = class;
new_set[0].neg_classes = neg_classes;
new_set[0].backref = backref;
new_set[1].position = -1;
- new_set[1].code_min = EMPTY;
- new_set[1].code_max = EMPTY;
+ new_set[1].code_min = -1;
+ new_set[1].code_max = -1;
return new_set;
}
@@ -1103,7 +1110,7 @@ tre_set_union(tre_mem_t mem, tre_pos_and_tags_t *set1, tre_pos_and_tags_t *set2,
new_set[s1].code_min = set1[s1].code_min;
new_set[s1].code_max = set1[s1].code_max;
new_set[s1].assertions = set1[s1].assertions | assertions;
- new_set[s1].classt = set1[s1].classt;
+ new_set[s1].class = set1[s1].class;
new_set[s1].neg_classes = set1[s1].neg_classes;
new_set[s1].backref = set1[s1].backref;
if (set1[s1].tags == NULL && tags == NULL)
@@ -1148,7 +1155,7 @@ tre_set_union(tre_mem_t mem, tre_pos_and_tags_t *set1, tre_pos_and_tags_t *set2,
new_set[s1 + s2].code_max = set2[s2].code_max;
/* XXX - why not | assertions here as well? */
new_set[s1 + s2].assertions = set2[s2].assertions;
- new_set[s1 + s2].classt = set2[s2].classt;
+ new_set[s1 + s2].class = set2[s2].class;
new_set[s1 + s2].neg_classes = set2[s2].neg_classes;
new_set[s1 + s2].backref = set2[s2].backref;
if (set2[s2].tags == NULL)
@@ -1231,7 +1238,7 @@ tre_match_empty(tre_stack_t *stack, tre_ast_node_t *node, int *tags,
break;
if (tags[i] < 0)
{
- tags[i] = lit->code_max;
+ tags[i] = (int)lit->code_max;
tags[i + 1] = -1;
}
}
@@ -1373,7 +1380,7 @@ tre_compute_nfl(tre_mem_t mem, tre_stack_t *stack, tre_ast_node_t *tree)
node->lastpos = tre_set_one(mem, lit->position,
(int)lit->code_min,
(int)lit->code_max,
- lit->u.classt, lit->neg_classes,
+ lit->u.class, lit->neg_classes,
-1);
if (!node->lastpos)
return REG_ESPACE;
@@ -1614,12 +1621,12 @@ tre_make_trans(tre_pos_and_tags_t *p1, tre_pos_and_tags_t *p2,
(trans + 1)->state = NULL;
/* Use the character ranges, assertions, etc. from `p1' for
the transition from `p1' to `p2'. */
- trans->code_min = p1->code_min;
- trans->code_max = p1->code_max;
+ trans->code_min = (tre_cint_t) p1->code_min;
+ trans->code_max = (tre_cint_t) p1->code_max;
trans->state = transitions + offs[p2->position];
trans->state_id = p2->position;
trans->assertions = p1->assertions | p2->assertions
- | (p1->classt ? ASSERT_CHAR_CLASS : 0)
+ | (p1->class ? ASSERT_CHAR_CLASS : 0)
| (p1->neg_classes != NULL ? ASSERT_CHAR_CLASS_NEG : 0);
if (p1->backref >= 0)
{
@@ -1629,7 +1636,7 @@ tre_make_trans(tre_pos_and_tags_t *p1, tre_pos_and_tags_t *p2,
trans->assertions |= ASSERT_BACKREF;
}
else
- trans->u.classt = p1->classt;
+ trans->u.class = p1->class;
if (p1->neg_classes != NULL)
{
for (i = 0; p1->neg_classes[i] != (tre_ctype_t)0; i++);
@@ -1743,8 +1750,8 @@ tre_make_trans(tre_pos_and_tags_t *p1, tre_pos_and_tags_t *p2,
DPRINT((", assert %d", trans->assertions));
if (trans->assertions & ASSERT_BACKREF)
DPRINT((", backref %d", trans->u.backref));
- else if (trans->u.classt)
- DPRINT((", class %ld", (long)trans->u.classt));
+ else if (trans->u.class)
+ DPRINT((", class %ld", (long)trans->u.class));
if (trans->neg_classes)
DPRINT((", neg_classes %p", trans->neg_classes));
if (trans->params)
@@ -1861,10 +1868,10 @@ tre_ast_to_tnfa(tre_ast_node_t *node, tre_tnfa_transition_t *transitions,
do \
{ \
errcode = err; \
- if (/*CONSTCOND*/1) \
+ if (/*CONSTCOND*/(void)1,1) \
goto error_exit; \
} \
- while (/*CONSTCOND*/0)
+ while (/*CONSTCOND*/(void)0,0)
int
@@ -2050,7 +2057,7 @@ tre_compile(regex_t *preg, const tre_char_t *regex, size_t n, int cflags)
if (TRE_MB_CUR_MAX == 1 && !tmp_ast_l->nullable)
{
int count = 0;
- int k; /* [i_a] */
+ tre_cint_t k;
DPRINT(("Characters that can start a match:"));
tnfa->firstpos_chars = xcalloc(256, sizeof(char));
if (tnfa->firstpos_chars == NULL)
@@ -2310,15 +2317,7 @@ tre_config(int query, void *result)
case TRE_CONFIG_VERSION:
*string_result = TRE_VERSION;
return REG_OK;
-
- case TRE_MB_CUR_MAX_VALUE: /* [i_a] */
-#if defined(TRE_MB_CUR_MAX)
- *int_result = TRE_MB_CUR_MAX;
-#else
- *int_result = 1;
-#endif
- break;
- }
+ }
return REG_NOMATCH;
}
diff --git a/src/extra/tre/tre-compile.h b/src/extra/tre/tre-compile.h
index 0d81cf2..51d5ac9 100644
--- a/src/extra/tre/tre-compile.h
+++ b/src/extra/tre/tre-compile.h
@@ -12,16 +12,11 @@
typedef struct {
int position;
-#if 0 /* [i_a] must be able to carry the full span of all [Unicode] character codes *PLUS* these 'specials': TAG, PARAMETER, BACKREF, ASSERTION and EMPTY */
- tre_cint_t code_min;
- tre_cint_t code_max;
-#else
int code_min;
int code_max;
-#endif
int *tags;
int assertions;
- tre_ctype_t classt;
+ tre_ctype_t class;
tre_ctype_t *neg_classes;
int backref;
int *params;
diff --git a/src/extra/tre/tre-internal.h b/src/extra/tre/tre-internal.h
index c1300ac..822998e 100644
--- a/src/extra/tre/tre-internal.h
+++ b/src/extra/tre/tre-internal.h
@@ -22,9 +22,9 @@
#ifdef TRE_DEBUG
#include <stdio.h>
-#define DPRINT(msg) do {printf msg; fflush(stdout);} while(/*CONSTCOND*/0)
+#define DPRINT(msg) do {printf msg; fflush(stdout);} while(/*CONSTCOND*/(void)0,0)
#else /* !TRE_DEBUG */
-#define DPRINT(msg) do { } while(/*CONSTCOND*/0)
+#define DPRINT(msg) do { } while(/*CONSTCOND*/(void)0,0)
#endif /* !TRE_DEBUG */
#define elementsof(x) ( sizeof(x) / sizeof(x[0]) )
@@ -151,13 +151,8 @@ typedef struct tnfa_transition tre_tnfa_transition_t;
struct tnfa_transition {
/* Range of accepted characters. */
-#if 0 /* [i_a] must be able to carry the full span of all [Unicode] character codes *PLUS* these 'specials': TAG, PARAMETER, BACKREF, ASSERTION and EMPTY */
tre_cint_t code_min;
tre_cint_t code_max;
-#else
- int code_min;
- int code_max;
-#endif
/* Pointer to the destination state. */
tre_tnfa_transition_t *state;
/* ID number of the destination state. */
@@ -171,7 +166,7 @@ struct tnfa_transition {
/* Assertion parameters. */
union {
/* Character class assertion. */
- tre_ctype_t classt;
+ tre_ctype_t class;
/* Back reference assertion. */
int backref;
} u;
diff --git a/src/extra/tre/tre-match-approx.c b/src/extra/tre/tre-match-approx.c
index 6011114..f08cd0f 100644
--- a/src/extra/tre/tre-match-approx.c
+++ b/src/extra/tre/tre-match-approx.c
@@ -328,7 +328,7 @@ tre_tnfa_run_approx(const tre_tnfa_t *tnfa, const void *string, int len,
GET_NEXT_WCHAR();
pos = 0;
- while (/*CONSTCOND*/1)
+ while (/*CONSTCOND*/(void)1,1)
{
DPRINT(("%03d:%2lc/%05d\n", pos, (tre_cint_t)next_c, (int)next_c));
diff --git a/src/extra/tre/tre-match-backtrack.c b/src/extra/tre/tre-match-backtrack.c
index 9630e81..9dd7e94 100644
--- a/src/extra/tre/tre-match-backtrack.c
+++ b/src/extra/tre/tre-match-backtrack.c
@@ -116,7 +116,7 @@ typedef struct tre_backtrack_struct {
#ifdef TRE_USE_ALLOCA
#define tre_bt_mem_new tre_mem_newa
#define tre_bt_mem_alloc tre_mem_alloca
-#define tre_bt_mem_destroy(obj) do { } while (0)
+#define tre_bt_mem_destroy(obj) do { } while (0,0)
#else /* !TRE_USE_ALLOCA */
#define tre_bt_mem_new tre_mem_new
#define tre_bt_mem_alloc tre_mem_alloc
@@ -173,7 +173,7 @@ typedef struct tre_backtrack_struct {
stack->item.tags[i] = (_tags)[i]; \
BT_STACK_MBSTATE_IN; \
} \
- while (/*CONSTCOND*/0)
+ while (/*CONSTCOND*/(void)0,0)
#define BT_STACK_POP() \
do \
@@ -186,13 +186,13 @@ typedef struct tre_backtrack_struct {
str_byte = stack->item.str_byte; \
BT_STACK_WIDE_OUT; \
state = stack->item.state; \
- next_c = (tre_char_t)stack->item.next_c; \
+ next_c = (tre_char_t) stack->item.next_c; \
for (i = 0; i < tnfa->num_tags; i++) \
tags[i] = stack->item.tags[i]; \
BT_STACK_MBSTATE_OUT; \
stack = stack->prev; \
} \
- while (/*CONSTCOND*/0)
+ while (/*CONSTCOND*/(void)0,0)
#undef MIN
#define MIN(a, b) ((a) <= (b) ? (a) : (b))
@@ -372,7 +372,7 @@ tre_tnfa_run_backtrack(const tre_tnfa_t *tnfa, const void *string,
if (state == NULL)
goto backtrack;
- while (/*CONSTCOND*/1)
+ while (/*CONSTCOND*/(void)1,1)
{
tre_tnfa_transition_t *next_state;
int empty_br_match;
@@ -632,7 +632,7 @@ tre_tnfa_run_backtrack(const tre_tnfa_t *tnfa, const void *string,
}
}
DPRINT(("restarting from next start position\n"));
- next_c = (tre_char_t)next_c_start;
+ next_c = (tre_char_t) next_c_start;
#ifdef TRE_MBSTATE
mbstate = mbstate_start;
#endif /* TRE_MBSTATE */
diff --git a/src/extra/tre/tre-match-parallel.c b/src/extra/tre/tre-match-parallel.c
index ddb9fda..6696d11 100644
--- a/src/extra/tre/tre-match-parallel.c
+++ b/src/extra/tre/tre-match-parallel.c
@@ -269,7 +269,7 @@ tre_tnfa_run_parallel(const tre_tnfa_t *tnfa, const void *string, int len,
DPRINT(("-------------+------------------------------------------------\n"));
reach_next_i = reach_next;
- while (/*CONSTCOND*/1)
+ while (/*CONSTCOND*/(void)1,1)
{
/* If no match found yet, add the initial states to `reach_next'. */
if (match_eo < 0)
diff --git a/src/extra/tre/tre-match-utils.h b/src/extra/tre/tre-match-utils.h
index 7d19c21..d0a4214 100644
--- a/src/extra/tre/tre-match-utils.h
+++ b/src/extra/tre/tre-match-utils.h
@@ -76,7 +76,7 @@
str_user_end = str_source->get_next_char(&next_c, &pos_add_next, \
str_source->context); \
} \
- } while(/*CONSTCOND*/0)
+ } while(/*CONSTCOND*/(void)0,0)
#else /* !TRE_MULTIBYTE */
@@ -107,7 +107,7 @@
str_user_end = str_source->get_next_char(&next_c, &pos_add_next, \
str_source->context); \
} \
- } while(/*CONSTCOND*/0)
+ } while(/*CONSTCOND*/(void)0,0)
#endif /* !TRE_MULTIBYTE */
@@ -132,7 +132,7 @@
str_user_end = str_source->get_next_char(&next_c, &pos_add_next, \
str_source->context); \
} \
- } while(/*CONSTCOND*/0)
+ } while(/*CONSTCOND*/(void)0,0)
#endif /* !TRE_WCHAR */
@@ -161,11 +161,11 @@
#define CHECK_CHAR_CLASSES(trans_i, tnfa, eflags) \
(((trans_i->assertions & ASSERT_CHAR_CLASS) \
&& !(tnfa->cflags & REG_ICASE) \
- && !tre_isctype((tre_cint_t)prev_c, trans_i->u.classt)) \
+ && !tre_isctype((tre_cint_t)prev_c, trans_i->u.class)) \
|| ((trans_i->assertions & ASSERT_CHAR_CLASS) \
&& (tnfa->cflags & REG_ICASE) \
- && !tre_isctype(tre_tolower((tre_cint_t)prev_c),trans_i->u.classt) \
- && !tre_isctype(tre_toupper((tre_cint_t)prev_c),trans_i->u.classt)) \
+ && !tre_isctype(tre_tolower((tre_cint_t)prev_c),trans_i->u.class) \
+ && !tre_isctype(tre_toupper((tre_cint_t)prev_c),trans_i->u.class)) \
|| ((trans_i->assertions & ASSERT_CHAR_CLASS_NEG) \
&& tre_neg_char_classes_match(trans_i->neg_classes,(tre_cint_t)prev_c,\
tnfa->cflags & REG_ICASE)))
diff --git a/src/extra/tre/tre-mem.c b/src/extra/tre/tre-mem.c
index 51b630c..67ba676 100644
--- a/src/extra/tre/tre-mem.c
+++ b/src/extra/tre/tre-mem.c
@@ -111,8 +111,8 @@ tre_mem_alloc_impl(tre_mem_t mem, int provided, void *provided_block,
block_size = size * 8;
else
block_size = TRE_MEM_BLOCK_SIZE;
- DPRINT(("tre_mem_alloc: allocating new %u byte block\n",
- (unsigned int)block_size));
+ DPRINT(("tre_mem_alloc: allocating new %lu byte block\n",
+ (unsigned long)block_size));
l = xmalloc(sizeof(*l));
if (l == NULL)
{
diff --git a/src/extra/tre/tre-parse.c b/src/extra/tre/tre-parse.c
index 50d0438..86ccad6 100644
--- a/src/extra/tre/tre-parse.c
+++ b/src/extra/tre/tre-parse.c
@@ -123,23 +123,22 @@ tre_new_item(tre_mem_t mem, int min, int max, int *i, int *max_i,
/* Expands a character class to character ranges. */
static reg_errcode_t
-tre_expand_ctype(tre_mem_t mem, tre_ctype_t classt, tre_ast_node_t ***items,
+tre_expand_ctype(tre_mem_t mem, tre_ctype_t class, tre_ast_node_t ***items,
int *i, int *max_i, int cflags)
{
reg_errcode_t status = REG_OK;
tre_cint_t c;
- tre_cint_t j;
- int min = EMPTY, max = 0;
+ int j, min = -1, max = 0;
//assert(TRE_MB_CUR_MAX == 1); It is the ctx->cur_max that matters
DPRINT((" expanding class to character ranges\n"));
for (j = 0; (j < 256) && (status == REG_OK); j++)
{
- c = j;
- if (tre_isctype(c, classt)
+ c = (tre_cint_t) j;
+ if (tre_isctype(c, class)
|| ((cflags & REG_ICASE)
- && (tre_isctype(tre_tolower(c), classt)
- || tre_isctype(tre_toupper(c), classt))))
+ && (tre_isctype(tre_tolower(c), class)
+ || tre_isctype(tre_toupper(c), class))))
{
if (min < 0)
min = c;
@@ -149,7 +148,7 @@ tre_expand_ctype(tre_mem_t mem, tre_ctype_t classt, tre_ast_node_t ***items,
{
DPRINT((" range %c (%d) to %c (%d)\n", min, min, max, max));
status = tre_new_item(mem, min, max, i, max_i, items);
- min = EMPTY;
+ min = -1;
}
}
if (min >= 0 && status == REG_OK)
@@ -164,7 +163,7 @@ tre_compare_items(const void *a, const void *b)
const tre_ast_node_t *node_a = *(tre_ast_node_t * const *)a;
const tre_ast_node_t *node_b = *(tre_ast_node_t * const *)b;
tre_literal_t *l_a = node_a->obj, *l_b = node_b->obj;
- int a_min = l_a->code_min, b_min = l_b->code_min;
+ long a_min = l_a->code_min, b_min = l_b->code_min;
if (a_min < b_min)
return -1;
@@ -255,7 +254,7 @@ tre_parse_bracket_items(tre_parse_ctx_t *ctx, int negate,
{
const tre_char_t *re = ctx->re;
reg_errcode_t status = REG_OK;
- tre_ctype_t classt = (tre_ctype_t)0;
+ tre_ctype_t class = (tre_ctype_t)0;
int i = *num_items;
int max_i = *items_size;
int skip;
@@ -278,7 +277,7 @@ tre_parse_bracket_items(tre_parse_ctx_t *ctx, int negate,
{
tre_cint_t min = 0, max = 0;
- classt = (tre_ctype_t)0;
+ class = (tre_ctype_t)0;
if (re + 2 < ctx->re_end
&& *(re + 1) == CHAR_MINUS && *(re + 2) != CHAR_RBRACKET)
{
@@ -330,15 +329,15 @@ tre_parse_bracket_items(tre_parse_ctx_t *ctx, int negate,
#endif /* !TRE_WCHAR */
tmp_str[len] = '\0';
DPRINT((" class name: %s\n", tmp_str));
- classt = tre_ctype(tmp_str);
- if (!classt)
+ class = tre_ctype(tmp_str);
+ if (!class)
status = REG_ECTYPE;
/* Optimize character classes for 8 bit character sets. */
if (status == REG_OK && ctx->cur_max == 1)
{
- status = tre_expand_ctype(ctx->mem, classt, items,
+ status = tre_expand_ctype(ctx->mem, class, items,
&i, &max_i, ctx->cflags);
- classt = (tre_ctype_t)0;
+ class = (tre_ctype_t)0;
skip = 1;
}
re = endptr + 2;
@@ -361,22 +360,22 @@ tre_parse_bracket_items(tre_parse_ctx_t *ctx, int negate,
if (status != REG_OK)
break;
- if (classt && negate)
+ if (class && negate)
if (*num_neg_classes >= MAX_NEG_CLASSES)
status = REG_ESPACE;
else
- neg_classes[(*num_neg_classes)++] = classt;
+ neg_classes[(*num_neg_classes)++] = class;
else if (!skip)
{
status = tre_new_item(ctx->mem, min, max, &i, &max_i, items);
if (status != REG_OK)
break;
- ((tre_literal_t*)((*items)[i-1])->obj)->u.classt = classt;
+ ((tre_literal_t*)((*items)[i-1])->obj)->u.class = class;
}
/* Add opposite-case counterpoints if REG_ICASE is present.
This is broken if there are more than two "same" characters. */
- if (ctx->cflags & REG_ICASE && !classt && status == REG_OK && !skip)
+ if (ctx->cflags & REG_ICASE && !class && status == REG_OK && !skip)
{
tre_cint_t cmin, ccurr;
@@ -455,11 +454,11 @@ tre_parse_bracket(tre_parse_ctx_t *ctx, tre_ast_node_t **result)
{
int min, max;
tre_literal_t *l = items[j]->obj;
- min = l->code_min;
- max = l->code_max;
+ min = (int) l->code_min;
+ max = (int) l->code_max;
DPRINT(("item: %d - %d, class %p, curr_max = %d\n",
- (int)l->code_min, (int)l->code_max, (void *)l->u.classt, curr_max));
+ (int)l->code_min, (int)l->code_max, (void *)l->u.class, curr_max));
if (negate)
{
@@ -831,7 +830,7 @@ tre_parse_bound(tre_parse_ctx_t *ctx, tre_ast_node_t **result)
/* Create the AST node(s). */
if (min == 0 && max == 0)
{
- *result = tre_ast_new_literal(ctx->mem, EMPTY, EMPTY, -1);
+ *result = tre_ast_new_literal(ctx->mem, EMPTY, -1, -1);
if (*result == NULL)
return REG_ESPACE;
}
@@ -1212,7 +1211,7 @@ tre_parse(tre_parse_ctx_t *ctx)
DPRINT(("tre_parse: extension: '%.*" STRF "\n",
REST(ctx->re)));
ctx->re += 2;
- while (/*CONSTCOND*/1)
+ while (/*CONSTCOND*/(void)1,1)
{
if (*ctx->re == L'i')
{
@@ -1352,7 +1351,7 @@ tre_parse(tre_parse_ctx_t *ctx)
subexpression was closed. POSIX leaves the meaning of
this to be implementation-defined. We interpret this as
an empty expression (which matches an empty string). */
- result = tre_ast_new_literal(ctx->mem, EMPTY, EMPTY, -1);
+ result = tre_ast_new_literal(ctx->mem, EMPTY, -1, -1);
if (result == NULL)
return REG_ESPACE;
if (!(ctx->cflags & REG_EXTENDED))
@@ -1645,7 +1644,7 @@ tre_parse(tre_parse_ctx_t *ctx)
{
DPRINT(("tre_parse: empty: '%.*" STRF "'\n",
REST(ctx->re)));
- result = tre_ast_new_literal(ctx->mem, EMPTY, EMPTY, -1);
+ result = tre_ast_new_literal(ctx->mem, EMPTY, -1, -1);
if (!result)
return REG_ESPACE;
break;
@@ -1715,7 +1714,7 @@ tre_parse(tre_parse_ctx_t *ctx)
if (result->submatch_id >= 0)
{
tre_ast_node_t *n, *tmp_node;
- n = tre_ast_new_literal(ctx->mem, EMPTY, EMPTY, -1);
+ n = tre_ast_new_literal(ctx->mem, EMPTY, -1, -1);
if (n == NULL)
return REG_ESPACE;
tmp_node = tre_ast_new_catenation(ctx->mem, n, result);
diff --git a/src/extra/tre/tre-stack.h b/src/extra/tre/tre-stack.h
index 7d11c5e..a1acbe7 100644
--- a/src/extra/tre/tre-stack.h
+++ b/src/extra/tre/tre-stack.h
@@ -54,7 +54,7 @@ declare_popf(int, int);
{ \
status = tre_stack_push_ ## typetag(s, value); \
} \
- while (/*CONSTCOND*/0)
+ while (/*CONSTCOND*/(void)0,0)
#define STACK_PUSHX(s, typetag, value) \
{ \
diff --git a/src/extra/tre/tre.h b/src/extra/tre/tre.h
index 9d7d3a7..128475d 100644
--- a/src/extra/tre/tre.h
+++ b/src/extra/tre/tre.h
@@ -137,14 +137,6 @@ extern int
tre_regexec(const regex_t *preg, const char *string, size_t nmatch,
regmatch_t pmatch[], int eflags);
-extern size_t
-tre_regerror(int errcode, const regex_t *preg, char *errbuf,
- size_t errbuf_size);
-
-extern void
-tre_regfree(regex_t *preg);
-
-/* R additions */
extern int
tre_regcompb(regex_t *preg, const char *regex, int cflags);
@@ -152,6 +144,13 @@ extern int
tre_regexecb(const regex_t *preg, const char *string, size_t nmatch,
regmatch_t pmatch[], int eflags);
+extern size_t
+tre_regerror(int errcode, const regex_t *preg, char *errbuf,
+ size_t errbuf_size);
+
+extern void
+tre_regfree(regex_t *preg);
+
#ifdef TRE_WCHAR
#ifdef HAVE_WCHAR_H
#include <wchar.h>
@@ -223,7 +222,10 @@ extern int
tre_regaexec(const regex_t *preg, const char *string,
regamatch_t *match, regaparams_t params, int eflags);
-/* R addition */
+extern int
+tre_reganexec(const regex_t *preg, const char *string, size_t len,
+ regamatch_t *match, regaparams_t params, int eflags);
+
extern int
tre_regaexecb(const regex_t *preg, const char *string,
regamatch_t *match, regaparams_t params, int eflags);
@@ -279,8 +281,7 @@ enum {
TRE_CONFIG_WCHAR,
TRE_CONFIG_MULTIBYTE,
TRE_CONFIG_SYSTEM_ABI,
- TRE_CONFIG_VERSION,
- TRE_MB_CUR_MAX_VALUE /* [i_a] - derived from MULTIBYTE and WCHAR, but still handy to have: no need to copy logic in TRE header files, etc. in order to know this */
+ TRE_CONFIG_VERSION
};
/* Returns 1 if the compiled pattern has back references, 0 if not. */

View file

@ -0,0 +1,709 @@
diff --git a/configure b/configure
index b3c299e..01f205d 100755
--- a/configure
+++ b/configure
@@ -5193,6 +5193,7 @@ elif test ${makeinfo_version_maj} -lt 4 \
else
r_cv_prog_makeinfo_v4=yes
fi
+r_cv_prog_makeinfo_v4=yes
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $r_cv_prog_makeinfo_v4" >&5
$as_echo "$r_cv_prog_makeinfo_v4" >&6; }
diff --git a/src/extra/tre/regcomp.c b/src/extra/tre/regcomp.c
index 93ddb92..31d4e52 100644
--- a/src/extra/tre/regcomp.c
+++ b/src/extra/tre/regcomp.c
@@ -99,7 +99,6 @@ tre_regncomp(regex_t *preg, const char *regex, size_t n, int cflags)
return ret;
}
-
/* this version takes bytes literally, to be used with raw vectors */
int
tre_regncompb(regex_t *preg, const char *regex, size_t n, int cflags)
@@ -131,7 +130,6 @@ tre_regcomp(regex_t *preg, const char *regex, int cflags)
return tre_regncomp(preg, regex, regex ? strlen(regex) : 0, cflags);
}
-/* R addition */
int
tre_regcompb(regex_t *preg, const char *regex, int cflags)
{
diff --git a/src/extra/tre/regexec.c b/src/extra/tre/regexec.c
index 6edaf81..d8f91a3 100644
--- a/src/extra/tre/regexec.c
+++ b/src/extra/tre/regexec.c
@@ -217,7 +217,6 @@ tre_regexec(const regex_t *preg, const char *str,
return tre_regnexec(preg, str, (unsigned)-1, nmatch, pmatch, eflags);
}
-/* R addition */
int
tre_regexecb(const regex_t *preg, const char *str,
size_t nmatch, regmatch_t pmatch[], int eflags)
@@ -329,7 +328,6 @@ tre_regaexec(const regex_t *preg, const char *str,
return tre_reganexec(preg, str, (unsigned)-1, match, params, eflags);
}
-/* R addition */
int
tre_regaexecb(const regex_t *preg, const char *str,
regamatch_t *match, regaparams_t params, int eflags)
diff --git a/src/extra/tre/tre-ast.h b/src/extra/tre/tre-ast.h
index 844aee3..d9af376 100644
--- a/src/extra/tre/tre-ast.h
+++ b/src/extra/tre/tre-ast.h
@@ -55,16 +55,11 @@ typedef struct {
tags, matching parameter settings, and all expressions that match one
character. */
typedef struct {
-#if 0 /* [i_a] must be able to carry the full span of all [Unicode] character codes *PLUS* these 'specials': TAG, PARAMETER, BACKREF, ASSERTION and EMPTY */
- tre_cint_t code_min;
- tre_cint_t code_max;
-#else
- int /* long */ code_min;
- int /* long */ code_max;
-#endif
+ long code_min;
+ long code_max;
int position;
union {
- tre_ctype_t classt; /* [i_a] wrong syntax colouring prevention */
+ tre_ctype_t class;
int *params;
} u;
tre_ctype_t *neg_classes;
diff --git a/src/extra/tre/tre-compile.c b/src/extra/tre/tre-compile.c
index 7886455..92c14ab 100644
--- a/src/extra/tre/tre-compile.c
+++ b/src/extra/tre/tre-compile.c
@@ -6,6 +6,13 @@
*/
+/*
+ TODO:
+ - Fix tre_ast_to_tnfa() to recurse using a stack instead of recursive
+ function calls.
+*/
+
+
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif /* HAVE_CONFIG_H */
@@ -684,8 +691,8 @@ tre_copy_ast(tre_mem_t mem, tre_stack_t *stack, tre_ast_node_t *ast,
{
tre_literal_t *lit = node->obj;
int pos = lit->position;
- int min = lit->code_min;
- int max = lit->code_max;
+ int min = (int)lit->code_min;
+ int max = (int)lit->code_max;
if (!IS_SPECIAL(lit) || IS_BACKREF(lit))
{
/* XXX - e.g. [ab] has only one position but two
@@ -945,7 +952,7 @@ tre_expand_ast(tre_mem_t mem, tre_stack_t *stack, tre_ast_node_t *ast,
seq2 = copy;
if (seq2 == NULL)
return REG_ESPACE;
- tmp = tre_ast_new_literal(mem, EMPTY, EMPTY, -1);
+ tmp = tre_ast_new_literal(mem, EMPTY, -1, -1);
if (tmp == NULL)
return REG_ESPACE;
seq2 = tre_ast_new_union(mem, tmp, seq2);
@@ -1052,15 +1059,15 @@ tre_set_empty(tre_mem_t mem)
return NULL;
new_set[0].position = -1;
- new_set[0].code_min = EMPTY;
- new_set[0].code_max = EMPTY;
+ new_set[0].code_min = -1;
+ new_set[0].code_max = -1;
return new_set;
}
static tre_pos_and_tags_t *
tre_set_one(tre_mem_t mem, int position, int code_min, int code_max,
- tre_ctype_t classt, tre_ctype_t *neg_classes, int backref)
+ tre_ctype_t class, tre_ctype_t *neg_classes, int backref)
{
tre_pos_and_tags_t *new_set;
@@ -1071,12 +1078,12 @@ tre_set_one(tre_mem_t mem, int position, int code_min, int code_max,
new_set[0].position = position;
new_set[0].code_min = code_min;
new_set[0].code_max = code_max;
- new_set[0].classt = classt;
+ new_set[0].class = class;
new_set[0].neg_classes = neg_classes;
new_set[0].backref = backref;
new_set[1].position = -1;
- new_set[1].code_min = EMPTY;
- new_set[1].code_max = EMPTY;
+ new_set[1].code_min = -1;
+ new_set[1].code_max = -1;
return new_set;
}
@@ -1103,7 +1110,7 @@ tre_set_union(tre_mem_t mem, tre_pos_and_tags_t *set1, tre_pos_and_tags_t *set2,
new_set[s1].code_min = set1[s1].code_min;
new_set[s1].code_max = set1[s1].code_max;
new_set[s1].assertions = set1[s1].assertions | assertions;
- new_set[s1].classt = set1[s1].classt;
+ new_set[s1].class = set1[s1].class;
new_set[s1].neg_classes = set1[s1].neg_classes;
new_set[s1].backref = set1[s1].backref;
if (set1[s1].tags == NULL && tags == NULL)
@@ -1148,7 +1155,7 @@ tre_set_union(tre_mem_t mem, tre_pos_and_tags_t *set1, tre_pos_and_tags_t *set2,
new_set[s1 + s2].code_max = set2[s2].code_max;
/* XXX - why not | assertions here as well? */
new_set[s1 + s2].assertions = set2[s2].assertions;
- new_set[s1 + s2].classt = set2[s2].classt;
+ new_set[s1 + s2].class = set2[s2].class;
new_set[s1 + s2].neg_classes = set2[s2].neg_classes;
new_set[s1 + s2].backref = set2[s2].backref;
if (set2[s2].tags == NULL)
@@ -1231,7 +1238,7 @@ tre_match_empty(tre_stack_t *stack, tre_ast_node_t *node, int *tags,
break;
if (tags[i] < 0)
{
- tags[i] = lit->code_max;
+ tags[i] = (int)lit->code_max;
tags[i + 1] = -1;
}
}
@@ -1373,7 +1380,7 @@ tre_compute_nfl(tre_mem_t mem, tre_stack_t *stack, tre_ast_node_t *tree)
node->lastpos = tre_set_one(mem, lit->position,
(int)lit->code_min,
(int)lit->code_max,
- lit->u.classt, lit->neg_classes,
+ lit->u.class, lit->neg_classes,
-1);
if (!node->lastpos)
return REG_ESPACE;
@@ -1614,12 +1621,12 @@ tre_make_trans(tre_pos_and_tags_t *p1, tre_pos_and_tags_t *p2,
(trans + 1)->state = NULL;
/* Use the character ranges, assertions, etc. from `p1' for
the transition from `p1' to `p2'. */
- trans->code_min = p1->code_min;
- trans->code_max = p1->code_max;
+ trans->code_min = (tre_cint_t) p1->code_min;
+ trans->code_max = (tre_cint_t) p1->code_max;
trans->state = transitions + offs[p2->position];
trans->state_id = p2->position;
trans->assertions = p1->assertions | p2->assertions
- | (p1->classt ? ASSERT_CHAR_CLASS : 0)
+ | (p1->class ? ASSERT_CHAR_CLASS : 0)
| (p1->neg_classes != NULL ? ASSERT_CHAR_CLASS_NEG : 0);
if (p1->backref >= 0)
{
@@ -1629,7 +1636,7 @@ tre_make_trans(tre_pos_and_tags_t *p1, tre_pos_and_tags_t *p2,
trans->assertions |= ASSERT_BACKREF;
}
else
- trans->u.classt = p1->classt;
+ trans->u.class = p1->class;
if (p1->neg_classes != NULL)
{
for (i = 0; p1->neg_classes[i] != (tre_ctype_t)0; i++);
@@ -1743,8 +1750,8 @@ tre_make_trans(tre_pos_and_tags_t *p1, tre_pos_and_tags_t *p2,
DPRINT((", assert %d", trans->assertions));
if (trans->assertions & ASSERT_BACKREF)
DPRINT((", backref %d", trans->u.backref));
- else if (trans->u.classt)
- DPRINT((", class %ld", (long)trans->u.classt));
+ else if (trans->u.class)
+ DPRINT((", class %ld", (long)trans->u.class));
if (trans->neg_classes)
DPRINT((", neg_classes %p", trans->neg_classes));
if (trans->params)
@@ -1861,10 +1868,10 @@ tre_ast_to_tnfa(tre_ast_node_t *node, tre_tnfa_transition_t *transitions,
do \
{ \
errcode = err; \
- if (/*CONSTCOND*/1) \
+ if (/*CONSTCOND*/(void)1,1) \
goto error_exit; \
} \
- while (/*CONSTCOND*/0)
+ while (/*CONSTCOND*/(void)0,0)
int
@@ -2050,7 +2057,7 @@ tre_compile(regex_t *preg, const tre_char_t *regex, size_t n, int cflags)
if (TRE_MB_CUR_MAX == 1 && !tmp_ast_l->nullable)
{
int count = 0;
- int k; /* [i_a] */
+ tre_cint_t k;
DPRINT(("Characters that can start a match:"));
tnfa->firstpos_chars = xcalloc(256, sizeof(char));
if (tnfa->firstpos_chars == NULL)
@@ -2310,15 +2317,7 @@ tre_config(int query, void *result)
case TRE_CONFIG_VERSION:
*string_result = TRE_VERSION;
return REG_OK;
-
- case TRE_MB_CUR_MAX_VALUE: /* [i_a] */
-#if defined(TRE_MB_CUR_MAX)
- *int_result = TRE_MB_CUR_MAX;
-#else
- *int_result = 1;
-#endif
- break;
- }
+ }
return REG_NOMATCH;
}
diff --git a/src/extra/tre/tre-compile.h b/src/extra/tre/tre-compile.h
index 0d81cf2..51d5ac9 100644
--- a/src/extra/tre/tre-compile.h
+++ b/src/extra/tre/tre-compile.h
@@ -12,16 +12,11 @@
typedef struct {
int position;
-#if 0 /* [i_a] must be able to carry the full span of all [Unicode] character codes *PLUS* these 'specials': TAG, PARAMETER, BACKREF, ASSERTION and EMPTY */
- tre_cint_t code_min;
- tre_cint_t code_max;
-#else
int code_min;
int code_max;
-#endif
int *tags;
int assertions;
- tre_ctype_t classt;
+ tre_ctype_t class;
tre_ctype_t *neg_classes;
int backref;
int *params;
diff --git a/src/extra/tre/tre-internal.h b/src/extra/tre/tre-internal.h
index c1300ac..822998e 100644
--- a/src/extra/tre/tre-internal.h
+++ b/src/extra/tre/tre-internal.h
@@ -22,9 +22,9 @@
#ifdef TRE_DEBUG
#include <stdio.h>
-#define DPRINT(msg) do {printf msg; fflush(stdout);} while(/*CONSTCOND*/0)
+#define DPRINT(msg) do {printf msg; fflush(stdout);} while(/*CONSTCOND*/(void)0,0)
#else /* !TRE_DEBUG */
-#define DPRINT(msg) do { } while(/*CONSTCOND*/0)
+#define DPRINT(msg) do { } while(/*CONSTCOND*/(void)0,0)
#endif /* !TRE_DEBUG */
#define elementsof(x) ( sizeof(x) / sizeof(x[0]) )
@@ -151,13 +151,8 @@ typedef struct tnfa_transition tre_tnfa_transition_t;
struct tnfa_transition {
/* Range of accepted characters. */
-#if 0 /* [i_a] must be able to carry the full span of all [Unicode] character codes *PLUS* these 'specials': TAG, PARAMETER, BACKREF, ASSERTION and EMPTY */
tre_cint_t code_min;
tre_cint_t code_max;
-#else
- int code_min;
- int code_max;
-#endif
/* Pointer to the destination state. */
tre_tnfa_transition_t *state;
/* ID number of the destination state. */
@@ -171,7 +166,7 @@ struct tnfa_transition {
/* Assertion parameters. */
union {
/* Character class assertion. */
- tre_ctype_t classt;
+ tre_ctype_t class;
/* Back reference assertion. */
int backref;
} u;
diff --git a/src/extra/tre/tre-match-approx.c b/src/extra/tre/tre-match-approx.c
index 6011114..f08cd0f 100644
--- a/src/extra/tre/tre-match-approx.c
+++ b/src/extra/tre/tre-match-approx.c
@@ -328,7 +328,7 @@ tre_tnfa_run_approx(const tre_tnfa_t *tnfa, const void *string, int len,
GET_NEXT_WCHAR();
pos = 0;
- while (/*CONSTCOND*/1)
+ while (/*CONSTCOND*/(void)1,1)
{
DPRINT(("%03d:%2lc/%05d\n", pos, (tre_cint_t)next_c, (int)next_c));
diff --git a/src/extra/tre/tre-match-backtrack.c b/src/extra/tre/tre-match-backtrack.c
index 9630e81..9dd7e94 100644
--- a/src/extra/tre/tre-match-backtrack.c
+++ b/src/extra/tre/tre-match-backtrack.c
@@ -116,7 +116,7 @@ typedef struct tre_backtrack_struct {
#ifdef TRE_USE_ALLOCA
#define tre_bt_mem_new tre_mem_newa
#define tre_bt_mem_alloc tre_mem_alloca
-#define tre_bt_mem_destroy(obj) do { } while (0)
+#define tre_bt_mem_destroy(obj) do { } while (0,0)
#else /* !TRE_USE_ALLOCA */
#define tre_bt_mem_new tre_mem_new
#define tre_bt_mem_alloc tre_mem_alloc
@@ -173,7 +173,7 @@ typedef struct tre_backtrack_struct {
stack->item.tags[i] = (_tags)[i]; \
BT_STACK_MBSTATE_IN; \
} \
- while (/*CONSTCOND*/0)
+ while (/*CONSTCOND*/(void)0,0)
#define BT_STACK_POP() \
do \
@@ -186,13 +186,13 @@ typedef struct tre_backtrack_struct {
str_byte = stack->item.str_byte; \
BT_STACK_WIDE_OUT; \
state = stack->item.state; \
- next_c = (tre_char_t)stack->item.next_c; \
+ next_c = (tre_char_t) stack->item.next_c; \
for (i = 0; i < tnfa->num_tags; i++) \
tags[i] = stack->item.tags[i]; \
BT_STACK_MBSTATE_OUT; \
stack = stack->prev; \
} \
- while (/*CONSTCOND*/0)
+ while (/*CONSTCOND*/(void)0,0)
#undef MIN
#define MIN(a, b) ((a) <= (b) ? (a) : (b))
@@ -372,7 +372,7 @@ tre_tnfa_run_backtrack(const tre_tnfa_t *tnfa, const void *string,
if (state == NULL)
goto backtrack;
- while (/*CONSTCOND*/1)
+ while (/*CONSTCOND*/(void)1,1)
{
tre_tnfa_transition_t *next_state;
int empty_br_match;
@@ -632,7 +632,7 @@ tre_tnfa_run_backtrack(const tre_tnfa_t *tnfa, const void *string,
}
}
DPRINT(("restarting from next start position\n"));
- next_c = (tre_char_t)next_c_start;
+ next_c = (tre_char_t) next_c_start;
#ifdef TRE_MBSTATE
mbstate = mbstate_start;
#endif /* TRE_MBSTATE */
diff --git a/src/extra/tre/tre-match-parallel.c b/src/extra/tre/tre-match-parallel.c
index ddb9fda..6696d11 100644
--- a/src/extra/tre/tre-match-parallel.c
+++ b/src/extra/tre/tre-match-parallel.c
@@ -269,7 +269,7 @@ tre_tnfa_run_parallel(const tre_tnfa_t *tnfa, const void *string, int len,
DPRINT(("-------------+------------------------------------------------\n"));
reach_next_i = reach_next;
- while (/*CONSTCOND*/1)
+ while (/*CONSTCOND*/(void)1,1)
{
/* If no match found yet, add the initial states to `reach_next'. */
if (match_eo < 0)
diff --git a/src/extra/tre/tre-match-utils.h b/src/extra/tre/tre-match-utils.h
index 7d19c21..d0a4214 100644
--- a/src/extra/tre/tre-match-utils.h
+++ b/src/extra/tre/tre-match-utils.h
@@ -76,7 +76,7 @@
str_user_end = str_source->get_next_char(&next_c, &pos_add_next, \
str_source->context); \
} \
- } while(/*CONSTCOND*/0)
+ } while(/*CONSTCOND*/(void)0,0)
#else /* !TRE_MULTIBYTE */
@@ -107,7 +107,7 @@
str_user_end = str_source->get_next_char(&next_c, &pos_add_next, \
str_source->context); \
} \
- } while(/*CONSTCOND*/0)
+ } while(/*CONSTCOND*/(void)0,0)
#endif /* !TRE_MULTIBYTE */
@@ -132,7 +132,7 @@
str_user_end = str_source->get_next_char(&next_c, &pos_add_next, \
str_source->context); \
} \
- } while(/*CONSTCOND*/0)
+ } while(/*CONSTCOND*/(void)0,0)
#endif /* !TRE_WCHAR */
@@ -161,11 +161,11 @@
#define CHECK_CHAR_CLASSES(trans_i, tnfa, eflags) \
(((trans_i->assertions & ASSERT_CHAR_CLASS) \
&& !(tnfa->cflags & REG_ICASE) \
- && !tre_isctype((tre_cint_t)prev_c, trans_i->u.classt)) \
+ && !tre_isctype((tre_cint_t)prev_c, trans_i->u.class)) \
|| ((trans_i->assertions & ASSERT_CHAR_CLASS) \
&& (tnfa->cflags & REG_ICASE) \
- && !tre_isctype(tre_tolower((tre_cint_t)prev_c),trans_i->u.classt) \
- && !tre_isctype(tre_toupper((tre_cint_t)prev_c),trans_i->u.classt)) \
+ && !tre_isctype(tre_tolower((tre_cint_t)prev_c),trans_i->u.class) \
+ && !tre_isctype(tre_toupper((tre_cint_t)prev_c),trans_i->u.class)) \
|| ((trans_i->assertions & ASSERT_CHAR_CLASS_NEG) \
&& tre_neg_char_classes_match(trans_i->neg_classes,(tre_cint_t)prev_c,\
tnfa->cflags & REG_ICASE)))
diff --git a/src/extra/tre/tre-mem.c b/src/extra/tre/tre-mem.c
index 51b630c..67ba676 100644
--- a/src/extra/tre/tre-mem.c
+++ b/src/extra/tre/tre-mem.c
@@ -111,8 +111,8 @@ tre_mem_alloc_impl(tre_mem_t mem, int provided, void *provided_block,
block_size = size * 8;
else
block_size = TRE_MEM_BLOCK_SIZE;
- DPRINT(("tre_mem_alloc: allocating new %u byte block\n",
- (unsigned int)block_size));
+ DPRINT(("tre_mem_alloc: allocating new %lu byte block\n",
+ (unsigned long)block_size));
l = xmalloc(sizeof(*l));
if (l == NULL)
{
diff --git a/src/extra/tre/tre-parse.c b/src/extra/tre/tre-parse.c
index 50d0438..86ccad6 100644
--- a/src/extra/tre/tre-parse.c
+++ b/src/extra/tre/tre-parse.c
@@ -123,23 +123,22 @@ tre_new_item(tre_mem_t mem, int min, int max, int *i, int *max_i,
/* Expands a character class to character ranges. */
static reg_errcode_t
-tre_expand_ctype(tre_mem_t mem, tre_ctype_t classt, tre_ast_node_t ***items,
+tre_expand_ctype(tre_mem_t mem, tre_ctype_t class, tre_ast_node_t ***items,
int *i, int *max_i, int cflags)
{
reg_errcode_t status = REG_OK;
tre_cint_t c;
- tre_cint_t j;
- int min = EMPTY, max = 0;
+ int j, min = -1, max = 0;
//assert(TRE_MB_CUR_MAX == 1); It is the ctx->cur_max that matters
DPRINT((" expanding class to character ranges\n"));
for (j = 0; (j < 256) && (status == REG_OK); j++)
{
- c = j;
- if (tre_isctype(c, classt)
+ c = (tre_cint_t) j;
+ if (tre_isctype(c, class)
|| ((cflags & REG_ICASE)
- && (tre_isctype(tre_tolower(c), classt)
- || tre_isctype(tre_toupper(c), classt))))
+ && (tre_isctype(tre_tolower(c), class)
+ || tre_isctype(tre_toupper(c), class))))
{
if (min < 0)
min = c;
@@ -149,7 +148,7 @@ tre_expand_ctype(tre_mem_t mem, tre_ctype_t classt, tre_ast_node_t ***items,
{
DPRINT((" range %c (%d) to %c (%d)\n", min, min, max, max));
status = tre_new_item(mem, min, max, i, max_i, items);
- min = EMPTY;
+ min = -1;
}
}
if (min >= 0 && status == REG_OK)
@@ -164,7 +163,7 @@ tre_compare_items(const void *a, const void *b)
const tre_ast_node_t *node_a = *(tre_ast_node_t * const *)a;
const tre_ast_node_t *node_b = *(tre_ast_node_t * const *)b;
tre_literal_t *l_a = node_a->obj, *l_b = node_b->obj;
- int a_min = l_a->code_min, b_min = l_b->code_min;
+ long a_min = l_a->code_min, b_min = l_b->code_min;
if (a_min < b_min)
return -1;
@@ -255,7 +254,7 @@ tre_parse_bracket_items(tre_parse_ctx_t *ctx, int negate,
{
const tre_char_t *re = ctx->re;
reg_errcode_t status = REG_OK;
- tre_ctype_t classt = (tre_ctype_t)0;
+ tre_ctype_t class = (tre_ctype_t)0;
int i = *num_items;
int max_i = *items_size;
int skip;
@@ -278,7 +277,7 @@ tre_parse_bracket_items(tre_parse_ctx_t *ctx, int negate,
{
tre_cint_t min = 0, max = 0;
- classt = (tre_ctype_t)0;
+ class = (tre_ctype_t)0;
if (re + 2 < ctx->re_end
&& *(re + 1) == CHAR_MINUS && *(re + 2) != CHAR_RBRACKET)
{
@@ -330,15 +329,15 @@ tre_parse_bracket_items(tre_parse_ctx_t *ctx, int negate,
#endif /* !TRE_WCHAR */
tmp_str[len] = '\0';
DPRINT((" class name: %s\n", tmp_str));
- classt = tre_ctype(tmp_str);
- if (!classt)
+ class = tre_ctype(tmp_str);
+ if (!class)
status = REG_ECTYPE;
/* Optimize character classes for 8 bit character sets. */
if (status == REG_OK && ctx->cur_max == 1)
{
- status = tre_expand_ctype(ctx->mem, classt, items,
+ status = tre_expand_ctype(ctx->mem, class, items,
&i, &max_i, ctx->cflags);
- classt = (tre_ctype_t)0;
+ class = (tre_ctype_t)0;
skip = 1;
}
re = endptr + 2;
@@ -361,22 +360,22 @@ tre_parse_bracket_items(tre_parse_ctx_t *ctx, int negate,
if (status != REG_OK)
break;
- if (classt && negate)
+ if (class && negate)
if (*num_neg_classes >= MAX_NEG_CLASSES)
status = REG_ESPACE;
else
- neg_classes[(*num_neg_classes)++] = classt;
+ neg_classes[(*num_neg_classes)++] = class;
else if (!skip)
{
status = tre_new_item(ctx->mem, min, max, &i, &max_i, items);
if (status != REG_OK)
break;
- ((tre_literal_t*)((*items)[i-1])->obj)->u.classt = classt;
+ ((tre_literal_t*)((*items)[i-1])->obj)->u.class = class;
}
/* Add opposite-case counterpoints if REG_ICASE is present.
This is broken if there are more than two "same" characters. */
- if (ctx->cflags & REG_ICASE && !classt && status == REG_OK && !skip)
+ if (ctx->cflags & REG_ICASE && !class && status == REG_OK && !skip)
{
tre_cint_t cmin, ccurr;
@@ -455,11 +454,11 @@ tre_parse_bracket(tre_parse_ctx_t *ctx, tre_ast_node_t **result)
{
int min, max;
tre_literal_t *l = items[j]->obj;
- min = l->code_min;
- max = l->code_max;
+ min = (int) l->code_min;
+ max = (int) l->code_max;
DPRINT(("item: %d - %d, class %p, curr_max = %d\n",
- (int)l->code_min, (int)l->code_max, (void *)l->u.classt, curr_max));
+ (int)l->code_min, (int)l->code_max, (void *)l->u.class, curr_max));
if (negate)
{
@@ -831,7 +830,7 @@ tre_parse_bound(tre_parse_ctx_t *ctx, tre_ast_node_t **result)
/* Create the AST node(s). */
if (min == 0 && max == 0)
{
- *result = tre_ast_new_literal(ctx->mem, EMPTY, EMPTY, -1);
+ *result = tre_ast_new_literal(ctx->mem, EMPTY, -1, -1);
if (*result == NULL)
return REG_ESPACE;
}
@@ -1212,7 +1211,7 @@ tre_parse(tre_parse_ctx_t *ctx)
DPRINT(("tre_parse: extension: '%.*" STRF "\n",
REST(ctx->re)));
ctx->re += 2;
- while (/*CONSTCOND*/1)
+ while (/*CONSTCOND*/(void)1,1)
{
if (*ctx->re == L'i')
{
@@ -1352,7 +1351,7 @@ tre_parse(tre_parse_ctx_t *ctx)
subexpression was closed. POSIX leaves the meaning of
this to be implementation-defined. We interpret this as
an empty expression (which matches an empty string). */
- result = tre_ast_new_literal(ctx->mem, EMPTY, EMPTY, -1);
+ result = tre_ast_new_literal(ctx->mem, EMPTY, -1, -1);
if (result == NULL)
return REG_ESPACE;
if (!(ctx->cflags & REG_EXTENDED))
@@ -1645,7 +1644,7 @@ tre_parse(tre_parse_ctx_t *ctx)
{
DPRINT(("tre_parse: empty: '%.*" STRF "'\n",
REST(ctx->re)));
- result = tre_ast_new_literal(ctx->mem, EMPTY, EMPTY, -1);
+ result = tre_ast_new_literal(ctx->mem, EMPTY, -1, -1);
if (!result)
return REG_ESPACE;
break;
@@ -1715,7 +1714,7 @@ tre_parse(tre_parse_ctx_t *ctx)
if (result->submatch_id >= 0)
{
tre_ast_node_t *n, *tmp_node;
- n = tre_ast_new_literal(ctx->mem, EMPTY, EMPTY, -1);
+ n = tre_ast_new_literal(ctx->mem, EMPTY, -1, -1);
if (n == NULL)
return REG_ESPACE;
tmp_node = tre_ast_new_catenation(ctx->mem, n, result);
diff --git a/src/extra/tre/tre-stack.h b/src/extra/tre/tre-stack.h
index 7d11c5e..a1acbe7 100644
--- a/src/extra/tre/tre-stack.h
+++ b/src/extra/tre/tre-stack.h
@@ -54,7 +54,7 @@ declare_popf(int, int);
{ \
status = tre_stack_push_ ## typetag(s, value); \
} \
- while (/*CONSTCOND*/0)
+ while (/*CONSTCOND*/(void)0,0)
#define STACK_PUSHX(s, typetag, value) \
{ \
diff --git a/src/extra/tre/tre.h b/src/extra/tre/tre.h
index 9d7d3a7..128475d 100644
--- a/src/extra/tre/tre.h
+++ b/src/extra/tre/tre.h
@@ -137,14 +137,6 @@ extern int
tre_regexec(const regex_t *preg, const char *string, size_t nmatch,
regmatch_t pmatch[], int eflags);
-extern size_t
-tre_regerror(int errcode, const regex_t *preg, char *errbuf,
- size_t errbuf_size);
-
-extern void
-tre_regfree(regex_t *preg);
-
-/* R additions */
extern int
tre_regcompb(regex_t *preg, const char *regex, int cflags);
@@ -152,6 +144,13 @@ extern int
tre_regexecb(const regex_t *preg, const char *string, size_t nmatch,
regmatch_t pmatch[], int eflags);
+extern size_t
+tre_regerror(int errcode, const regex_t *preg, char *errbuf,
+ size_t errbuf_size);
+
+extern void
+tre_regfree(regex_t *preg);
+
#ifdef TRE_WCHAR
#ifdef HAVE_WCHAR_H
#include <wchar.h>
@@ -223,7 +222,10 @@ extern int
tre_regaexec(const regex_t *preg, const char *string,
regamatch_t *match, regaparams_t params, int eflags);
-/* R addition */
+extern int
+tre_reganexec(const regex_t *preg, const char *string, size_t len,
+ regamatch_t *match, regaparams_t params, int eflags);
+
extern int
tre_regaexecb(const regex_t *preg, const char *string,
regamatch_t *match, regaparams_t params, int eflags);
@@ -279,8 +281,7 @@ enum {
TRE_CONFIG_WCHAR,
TRE_CONFIG_MULTIBYTE,
TRE_CONFIG_SYSTEM_ABI,
- TRE_CONFIG_VERSION,
- TRE_MB_CUR_MAX_VALUE /* [i_a] - derived from MULTIBYTE and WCHAR, but still handy to have: no need to copy logic in TRE header files, etc. in order to know this */
+ TRE_CONFIG_VERSION
};
/* Returns 1 if the compiled pattern has back references, 0 if not. */

View file

@ -7,3 +7,7 @@ all platforms, create a patch file at `patches/R-${R_VERSION}.patch` (such as
To add a patch for an R version on a specific platform create a patch file at
`patches/R-${R_VERSION}-${OS_IDENTIFIER}.patch` (such as
`patches/R-3.3.0-centos-8.patch`).
To add a patch for an R version on a specific architecture, create a patch
file at `patches/R-${R_VERSION}-<arch>.patch`, where `<arch>` can be
`x86_64` or `aarch64` (e.g. `patches/R-3.3.0-aarch64.patch`).