public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
From: "cvs-commit at gcc dot gnu.org" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug libstdc++/77760] get_time needs to set tm_wday amd tm_yday
Date: Mon, 10 Jan 2022 14:40:44 +0000	[thread overview]
Message-ID: <bug-77760-4-78KSdnxMzz@http.gcc.gnu.org/bugzilla/> (raw)
In-Reply-To: <bug-77760-4@http.gcc.gnu.org/bugzilla/>

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77760

--- Comment #2 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jakub Jelinek <jakub@gcc.gnu.org>:

https://gcc.gnu.org/g:a8d3c98746098e2784be7144c1ccc9fcc34a0888

commit r12-6410-ga8d3c98746098e2784be7144c1ccc9fcc34a0888
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Mon Jan 10 15:38:47 2022 +0100

    libstdc++: Add %j, %U, %w, %W time_get support, fix %y, %Y, %C, %p
[PR77760]

    glibc strptime passes around some state, what fields in struct tm have been
    set and what needs to be finalized through possibly recursive calls, and
    at the end performs various finalizations, like applying %p so that it
    works for both %I %p and %p %I orders, or applying century so that both
    %C %y and %y %C works, or computation of missing fields from others
    (e.g. from %Y and %j one can compute tm_mon, tm_mday and tm_wday,
    from %Y %U %w, %Y %W %w, %Y %U %a, or %Y %W %w one can compute
    tm_mon, tm_mday, tm_yday or e.g. from %Y %m %d one can compute tm_wday
    and tm_yday.

    As the finalization is quite large and doesn't need to be a template
    (doesn't depend on any iterators or char types), I've put it into
libstdc++,
    and left some padding in the state struct, so that perhaps in the future we
    can track some more state without changing ABI.

    Unfortunately, there is an ugly problem that the standard mandates that
    get method calls the do_get virtual method and I don't see how we can
    cary on any state in between those calls (even if we did an ABI change
    for the facets, the methods are const, so that I think multiple threads
    could use the same time_get objects and we couldn't store state in there).

    There is a hack for that for GCC (seems to work with ICC too, doesn't work
    with clang++) if the do_get method isn't overriden we can pass the state
    around.

    For both do_get_year and per IRC discussions also for %y, the behavior is
    if 1-2 digits are parsed, the year is treated according to POSIX 2008 %y
    rules (0-68 is 2000-2068, 69-99 is 1969-1999), if 3-4 digits are parsed,
    it is treated as %Y.

    2022-01-10  Jakub Jelinek  <jakub@redhat.com>

            PR libstdc++/77760
            * include/bits/locale_facets_nonio.h (__time_get_state): New
struct.
            (time_get::_M_extract_via_format): Declare new method with
            __time_get_state& as an extra argument.
            * include/bits/locale_facets_nonio.tcc (_M_extract_via_format): Add
            __state argument, set various fields in it while parsing.  Handle
%j,
            %U, %w and %W, fix up handling of %y, %Y and %C, don't adjust
tm_hour
            for %p immediately.  Add a wrapper around the method without the
            __state argument for backwards compatibility.
            (_M_extract_num): Remove all __len == 4 special cases.
            (time_get::do_get_time, time_get::do_get_date, time_get::do_get):
Zero
            initialize __state, pass it to _M_extract_via_format and finalize
it
            at the end.
            (do_get_year): For 1-2 digit parsed years, map 0-68 to 2000-2068,
            69-99 to 1969-1999.  For 3-4 digit parsed years use that as year.
            (get): If do_get isn't overloaded from the locale_facets_nonio.tcc
            version, don't call do_get but call _M_extract_via_format instead
to
            pass around state.
            * config/abi/pre/gnu.ver (GLIBCXX_3.4.30): Export
_M_extract_via_format
            with extra __time_get_state and
__time_get_state::_M_finalize_state.
            * src/c++98/locale_facets.cc (is_leap, day_of_the_week,
            day_of_the_year): New functions in anon namespace.
            (mon_yday): New var in anon namespace.
            (__time_get_state::_M_finalize_state): Define.
            * testsuite/22_locale/time_get/get/char/4.cc: New test.
            * testsuite/22_locale/time_get/get/wchar_t/4.cc: New test.
            * testsuite/22_locale/time_get/get_year/char/1.cc (test01): Parse
197
            as year 197AD instead of error.
            * testsuite/22_locale/time_get/get_year/char/5.cc (test01): Parse 1
as
            year 2001 instead of error.
            * testsuite/22_locale/time_get/get_year/char/6.cc: New test.
            * testsuite/22_locale/time_get/get_year/wchar_t/1.cc (test01):
Parse
            197 as year 197AD instead of error.
            * testsuite/22_locale/time_get/get_year/wchar_t/5.cc (test01):
Parse
            1 as year 2001 instead of error.
            * testsuite/22_locale/time_get/get_year/wchar_t/6.cc: New test.

  parent reply	other threads:[~2022-01-10 14:40 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <bug-77760-4@http.gcc.gnu.org/bugzilla/>
2021-12-15 19:43 ` jakub at gcc dot gnu.org
2022-01-10 14:40 ` cvs-commit at gcc dot gnu.org [this message]
2023-02-09  8:50 ` aoliva at gcc dot gnu.org
2023-02-09  9:08 ` jakub at gcc dot gnu.org
2023-02-09 23:40 ` aoliva at gcc dot gnu.org
2023-02-10  3:05 ` redi at gcc dot gnu.org
2023-02-10  8:33 ` jakub at gcc dot gnu.org
2023-02-17  7:54 ` aoliva at gcc dot gnu.org

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=bug-77760-4-78KSdnxMzz@http.gcc.gnu.org/bugzilla/ \
    --to=gcc-bugzilla@gcc.gnu.org \
    --cc=gcc-bugs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).