aboutsummaryrefslogtreecommitdiffstats
path: root/regparse.c
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2023-11-02 23:35:19 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2023-11-03 10:41:48 +0900
commit5cff4c5aa375787924e2df5c0b981dd922b95a8c (patch)
tree7b048b53295a0d5946081de14adc6fd9d05d4f03 /regparse.c
parent8b02de8f41296d1a2449ecaeb24726f088ce899c (diff)
downloadruby-5cff4c5aa375787924e2df5c0b981dd922b95a8c.tar.gz
Fix onigmo name table without st
Co-authored-by: Adam Hess <HParker@github.com>
Diffstat (limited to 'regparse.c')
-rw-r--r--regparse.c87
1 files changed, 85 insertions, 2 deletions
diff --git a/regparse.c b/regparse.c
index a8a7a0975a..33480a66b8 100644
--- a/regparse.c
+++ b/regparse.c
@@ -251,7 +251,7 @@ bitset_copy(BitSetRef dest, BitSetRef bs)
#if defined(USE_NAMED_GROUP) && !defined(USE_ST_LIBRARY)
extern int
-onig_strncmp(const UChar* s1, const UChar* s2, int n)
+onig_strncmp(const UChar* s1, const UChar* s2, size_t n)
{
int x;
@@ -551,6 +551,17 @@ onig_names_free(regex_t* reg)
return 0;
}
+extern int
+onig_names_copy(regex_t* reg, regex_t* oreg)
+{
+ NameTable* table = oreg->name_table;
+ if (table) {
+ NameTable* t = st_copy(table);
+ reg->name_table = t;
+ }
+ return 0;
+}
+
static NameEntry*
name_find(regex_t* reg, const UChar* name, const UChar* name_end)
{
@@ -736,10 +747,52 @@ onig_names_free(regex_t* reg)
return 0;
}
+extern int
+onig_names_copy(regex_t* reg, regex_t* oreg)
+{
+ NameTable* ot = oreg->name_table;
+ if (ot) {
+ OnigEncoding enc = oreg->enc;
+ int i, num = ot->num;
+ NameTable* t = xmalloc(sizeof(*t));
+ CHECK_NULL_RETURN_MEMERR(t);
+ *t = *ot;
+ t->e = xmalloc(t->alloc * sizeof(t->e[0]));
+ if (IS_NULL(t->e)) {
+ xfree(t);
+ return ONIGERR_MEMORY;
+ }
+ t->num = 0;
+ reg->name_table = t;
+ for (i = 0; i < num; t->num = ++i) {
+ NameEntry* oe = &(ot->e[i]);
+ NameEntry* e = &(t->e[i]);
+ *e = *oe;
+ e->name = NULL;
+ e->back_refs = NULL;
+ e->name = strdup_with_null(enc, oe->name, oe->name + e->name_len);
+ if (IS_NULL(e->name)) {
+ onig_names_free(reg);
+ return ONIGERR_MEMORY;
+ }
+ e->back_refs = xmalloc(e->back_alloc * sizeof(e->back_refs[0]));
+ if (IS_NULL(e->back_refs)) {
+ xfree(e->name);
+ onig_names_free(reg);
+ return ONIGERR_MEMORY;
+ }
+ memcpy(e->back_refs, oe->back_refs, e->back_num * sizeof(e->back_refs[0]));
+ e->back_ref1 = e->back_refs[0];
+ }
+ }
+ return 0;
+}
+
static NameEntry*
name_find(regex_t* reg, const UChar* name, const UChar* name_end)
{
- int i, len;
+ int i;
+ size_t len;
NameEntry* e;
NameTable* t = (NameTable* )reg->name_table;
@@ -775,6 +828,30 @@ onig_foreach_name(regex_t* reg,
}
extern int
+onig_renumber_name_table(regex_t* reg, GroupNumRemap* map)
+{
+ int i, j;
+ NameEntry* e;
+ NameTable* t = (NameTable* )reg->name_table;
+
+ if (IS_NOT_NULL(t)) {
+ for (i = 0; i < t->num; i++) {
+ e = &(t->e[i]);
+
+ if (e->back_num > 1) {
+ for (j = 0; j < e->back_num; j++) {
+ e->back_refs[j] = map[e->back_refs[j]].new_val;
+ }
+ }
+ else if (e->back_num == 1) {
+ e->back_ref1 = map[e->back_ref1].new_val;
+ }
+ }
+ }
+ return 0;
+}
+
+extern int
onig_number_of_names(const regex_t* reg)
{
NameTable* t = (NameTable* )reg->name_table;
@@ -976,6 +1053,12 @@ onig_number_of_names(const regex_t* reg)
{
return 0;
}
+
+extern int
+onig_names_copy(regex_t* reg, regex_t* oreg)
+{
+ return 0;
+}
#endif /* else USE_NAMED_GROUP */
extern int