@@ -144,7 +144,7 @@ valid_range_p(VALUE v, int a, int b)
144144do { \
145145 size_t l; \
146146 l = date__strptime_internal(&str[si], slen - si, \
147- fmt, sizeof fmt - 1, hash); \
147+ fmt, sizeof fmt - 1, hash, enc ); \
148148 if (fail_p()) \
149149 return 0; \
150150 si += l; \
@@ -160,7 +160,8 @@ head_match_p(size_t len, const char *name, const char *str, size_t slen, size_t
160160
161161static size_t
162162date__strptime_internal (const char * str , size_t slen ,
163- const char * fmt , size_t flen , VALUE hash )
163+ const char * fmt , size_t flen ,
164+ VALUE hash , rb_encoding * enc )
164165{
165166 size_t si , fi ;
166167 int c ;
@@ -597,15 +598,14 @@ date__strptime_internal(const char *str, size_t slen,
597598
598599 b = rb_backref_get ();
599600 rb_match_busy (b );
600- m = f_match (pat , rb_usascii_str_new (& str [si ], slen - si ));
601+ m = f_match (pat , rb_enc_str_new (& str [si ], slen - si , enc ));
601602
602603 if (!NIL_P (m )) {
603- VALUE s , l , o ;
604+ VALUE s , o ;
604605
605606 s = rb_reg_nth_match (1 , m );
606- l = f_end (m , INT2FIX (0 ));
607607 o = date_zone_to_diff (s );
608- si += NUM2LONG ( l ) ;
608+ si += RMATCH_REGS ( m ) -> end [ 0 ] ;
609609 set_hash ("zone" , s );
610610 set_hash ("offset" , o );
611611 rb_backref_set (b );
@@ -654,20 +654,21 @@ date__strptime_internal(const char *str, size_t slen,
654654
655655VALUE
656656date__strptime (const char * str , size_t slen ,
657- const char * fmt , size_t flen , VALUE hash )
657+ const char * fmt , size_t flen ,
658+ VALUE hash , rb_encoding * enc )
658659{
659660 size_t si ;
660661 VALUE cent , merid ;
661662
662- si = date__strptime_internal (str , slen , fmt , flen , hash );
663+ si = date__strptime_internal (str , slen , fmt , flen , hash , enc );
663664
664665 if (fail_p ())
665666 return Qnil ;
666667
667668 if (slen > si ) {
668669 VALUE s ;
669670
670- s = rb_usascii_str_new (& str [si ], slen - si );
671+ s = rb_enc_str_new (& str [si ], slen - si , enc );
671672 set_hash ("leftover" , s );
672673 }
673674
0 commit comments