ruby-changes:23784
From: nobu <ko1@a...>
Date: Tue, 29 May 2012 17:28:20 +0900 (JST)
Subject: [ruby-changes:23784] nobu:r35835 (trunk): strftime.c: fix locale modifier
nobu 2012-05-29 17:28:09 +0900 (Tue, 29 May 2012) New Revision: 35835 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=35835 Log: strftime.c: fix locale modifier partially borrowed from ext/date. * strftime.c (rb_strftime_with_timespec): check conversion with locale modifier. Modified files: trunk/ChangeLog trunk/strftime.c trunk/test/ruby/test_time.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 35834) +++ ChangeLog (revision 35835) @@ -1,5 +1,8 @@ -Tue May 29 17:28:09 2012 Nobuyoshi Nakada <nobu@r...> +Tue May 29 17:28:15 2012 Nobuyoshi Nakada <nobu@r...> + * strftime.c (rb_strftime_with_timespec): check conversion with locale + modifier. + * strftime.c (rb_strftime_with_timespec): colons are valid only for 'z' and must come just before it. Index: strftime.c =================================================================== --- strftime.c (revision 35834) +++ strftime.c (revision 35835) @@ -187,7 +187,7 @@ long y; int precision, flags, colons; char padding; - enum {LEFT, CHCASE, LOWER, UPPER, LOCALE_O, LOCALE_E}; + enum {LEFT, CHCASE, LOWER, UPPER}; #define BIT_OF(n) (1U<<(n)) #ifdef MAILHEADER_EXT int sign; @@ -222,7 +222,7 @@ for (; *format && s < endp - 1; format++) { #define FLAG_FOUND() do { \ - if (precision > 0 || flags & (BIT_OF(LOCALE_E)|BIT_OF(LOCALE_O))) \ + if (precision > 0) \ goto unknown; \ } while (0) #define NEEDS(n) do if (s >= endp || (n) >= endp - s - 1) goto err; while (0) @@ -608,11 +608,13 @@ case 'E': /* POSIX locale extensions, ignored for now */ - flags |= BIT_OF(LOCALE_E); + if (!format[1] || !strchr("cCxXyY", format[1])) + goto unknown; goto again; case 'O': /* POSIX locale extensions, ignored for now */ - flags |= BIT_OF(LOCALE_O); + if (!format[1] || !strchr("deHkIlmMSuUVwWy", format[1])) + goto unknown; goto again; case 'V': /* week of year according ISO 8601 */ Index: test/ruby/test_time.rb =================================================================== --- test/ruby/test_time.rb (revision 35834) +++ test/ruby/test_time.rb (revision 35835) @@ -613,6 +613,11 @@ assert_equal(" 2", t.strftime("%_l")) end + def test_strftime_invalid_flags + t = Time.mktime(2001, 10, 1, 2, 0, 0) + assert_equal("%4^p", t.strftime("%4^p"), 'prec after flag') + end + def test_strftime_year t = Time.utc(1,1,4) assert_equal("0001", t.strftime("%Y")) @@ -728,6 +733,19 @@ assert_equal("-000:55:00", t.strftime("%10::z"), bug6323) end + def test_strftime_invalid_modifier + t = T2000.getlocal("+09:00") + assert_equal("%:y", t.strftime("%:y"), 'invalid conversion after : modifier') + assert_equal("%:0z", t.strftime("%:0z"), 'flag after : modifier') + assert_equal("%:10z", t.strftime("%:10z"), 'prec after : modifier') + assert_equal("%Ob", t.strftime("%Ob"), 'invalid conversion after locale modifier') + assert_equal("%Eb", t.strftime("%Eb"), 'invalid conversion after locale modifier') + assert_equal("%O0y", t.strftime("%O0y"), 'flag after locale modifier') + assert_equal("%E0y", t.strftime("%E0y"), 'flag after locale modifier') + assert_equal("%O10y", t.strftime("%O10y"), 'prec after locale modifier') + assert_equal("%E10y", t.strftime("%E10y"), 'prec after locale modifier') + end + def test_delegate d1 = SimpleDelegator.new(t1 = Time.utc(2000)) d2 = SimpleDelegator.new(t2 = Time.utc(2001)) -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/