@@ -251,7 +251,7 @@ bitset_copy(BitSetRef dest, BitSetRef bs)
251251
252252#if defined(USE_NAMED_GROUP ) && !defined(USE_ST_LIBRARY )
253253extern 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+
554565static NameEntry *
555566name_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+
739791static NameEntry *
740792name_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+
777854extern int
778855onig_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
9811064extern int
0 commit comments