Skip to content

Commit 5cff4c5

Browse files
nobuHParker
andcommitted
Fix onigmo name table without st
Co-authored-by: Adam Hess <HParker@github.com>
1 parent 8b02de8 commit 5cff4c5

File tree

3 files changed

+89
-5
lines changed

3 files changed

+89
-5
lines changed

regcomp.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5729,7 +5729,7 @@ onig_reg_copy(regex_t** nreg, regex_t* oreg)
57295729
goto err_repeat_range;
57305730
}
57315731
if (IS_NOT_NULL(reg->name_table)) {
5732-
if (IS_NULL(reg->name_table = st_copy(reg->name_table)))
5732+
if (onig_names_copy(reg, oreg))
57335733
goto err_name_table;
57345734
}
57355735
if (IS_NOT_NULL(reg->chain)) {
@@ -5740,7 +5740,7 @@ onig_reg_copy(regex_t** nreg, regex_t* oreg)
57405740
# undef COPY_FAILED
57415741

57425742
err_chain:
5743-
onig_st_free_table(reg->name_table);
5743+
onig_names_free(reg);
57445744
err_name_table:
57455745
xfree(reg->repeat_range);
57465746
err_repeat_range:

regparse.c

Lines changed: 85 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ bitset_copy(BitSetRef dest, BitSetRef bs)
251251

252252
#if defined(USE_NAMED_GROUP) && !defined(USE_ST_LIBRARY)
253253
extern int
254-
onig_strncmp(const UChar* s1, const UChar* s2, int n)
254+
onig_strncmp(const UChar* s1, const UChar* s2, size_t n)
255255
{
256256
int x;
257257

@@ -551,6 +551,17 @@ onig_names_free(regex_t* reg)
551551
return 0;
552552
}
553553

554+
extern int
555+
onig_names_copy(regex_t* reg, regex_t* oreg)
556+
{
557+
NameTable* table = oreg->name_table;
558+
if (table) {
559+
NameTable* t = st_copy(table);
560+
reg->name_table = t;
561+
}
562+
return 0;
563+
}
564+
554565
static NameEntry*
555566
name_find(regex_t* reg, const UChar* name, const UChar* name_end)
556567
{
@@ -736,10 +747,52 @@ onig_names_free(regex_t* reg)
736747
return 0;
737748
}
738749

750+
extern int
751+
onig_names_copy(regex_t* reg, regex_t* oreg)
752+
{
753+
NameTable* ot = oreg->name_table;
754+
if (ot) {
755+
OnigEncoding enc = oreg->enc;
756+
int i, num = ot->num;
757+
NameTable* t = xmalloc(sizeof(*t));
758+
CHECK_NULL_RETURN_MEMERR(t);
759+
*t = *ot;
760+
t->e = xmalloc(t->alloc * sizeof(t->e[0]));
761+
if (IS_NULL(t->e)) {
762+
xfree(t);
763+
return ONIGERR_MEMORY;
764+
}
765+
t->num = 0;
766+
reg->name_table = t;
767+
for (i = 0; i < num; t->num = ++i) {
768+
NameEntry* oe = &(ot->e[i]);
769+
NameEntry* e = &(t->e[i]);
770+
*e = *oe;
771+
e->name = NULL;
772+
e->back_refs = NULL;
773+
e->name = strdup_with_null(enc, oe->name, oe->name + e->name_len);
774+
if (IS_NULL(e->name)) {
775+
onig_names_free(reg);
776+
return ONIGERR_MEMORY;
777+
}
778+
e->back_refs = xmalloc(e->back_alloc * sizeof(e->back_refs[0]));
779+
if (IS_NULL(e->back_refs)) {
780+
xfree(e->name);
781+
onig_names_free(reg);
782+
return ONIGERR_MEMORY;
783+
}
784+
memcpy(e->back_refs, oe->back_refs, e->back_num * sizeof(e->back_refs[0]));
785+
e->back_ref1 = e->back_refs[0];
786+
}
787+
}
788+
return 0;
789+
}
790+
739791
static NameEntry*
740792
name_find(regex_t* reg, const UChar* name, const UChar* name_end)
741793
{
742-
int i, len;
794+
int i;
795+
size_t len;
743796
NameEntry* e;
744797
NameTable* t = (NameTable* )reg->name_table;
745798

@@ -774,6 +827,30 @@ onig_foreach_name(regex_t* reg,
774827
return 0;
775828
}
776829

830+
extern int
831+
onig_renumber_name_table(regex_t* reg, GroupNumRemap* map)
832+
{
833+
int i, j;
834+
NameEntry* e;
835+
NameTable* t = (NameTable* )reg->name_table;
836+
837+
if (IS_NOT_NULL(t)) {
838+
for (i = 0; i < t->num; i++) {
839+
e = &(t->e[i]);
840+
841+
if (e->back_num > 1) {
842+
for (j = 0; j < e->back_num; j++) {
843+
e->back_refs[j] = map[e->back_refs[j]].new_val;
844+
}
845+
}
846+
else if (e->back_num == 1) {
847+
e->back_ref1 = map[e->back_ref1].new_val;
848+
}
849+
}
850+
}
851+
return 0;
852+
}
853+
777854
extern int
778855
onig_number_of_names(const regex_t* reg)
779856
{
@@ -976,6 +1053,12 @@ onig_number_of_names(const regex_t* reg)
9761053
{
9771054
return 0;
9781055
}
1056+
1057+
extern int
1058+
onig_names_copy(regex_t* reg, regex_t* oreg)
1059+
{
1060+
return 0;
1061+
}
9791062
#endif /* else USE_NAMED_GROUP */
9801063

9811064
extern int

regparse.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ typedef struct {
339339
extern int onig_renumber_name_table(regex_t* reg, GroupNumRemap* map);
340340
#endif
341341

342-
extern int onig_strncmp(const UChar* s1, const UChar* s2, int n);
342+
extern int onig_strncmp(const UChar* s1, const UChar* s2, size_t n);
343343
extern void onig_strcpy(UChar* dest, const UChar* src, const UChar* end);
344344
extern void onig_scan_env_set_error_string(ScanEnv* env, int ecode, UChar* arg, UChar* arg_end);
345345
extern int onig_scan_unsigned_number(UChar** src, const UChar* end, OnigEncoding enc);
@@ -356,6 +356,7 @@ extern Node* onig_node_list_add(Node* list, Node* x);
356356
extern Node* onig_node_new_alt(Node* left, Node* right);
357357
extern void onig_node_str_clear(Node* node);
358358
extern int onig_names_free(regex_t* reg);
359+
extern int onig_names_copy(regex_t* reg, regex_t* oreg);
359360
extern int onig_parse_make_tree(Node** root, const UChar* pattern, const UChar* end, regex_t* reg, ScanEnv* env);
360361
extern int onig_free_shared_cclass_table(void);
361362

0 commit comments

Comments
 (0)