Re: [PATCH 3/3] libc: Replace one letter member names in __tzrule_struct

Jeff Johnston via Newlib <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <CAOox84vCHooof2=E+VtkSdT2gWkEbk5C8K4ffYfyadZ5e1+ixQ@mail.gmail.com>
On Fri, Oct 2, 2020 at 3:36 AM Torbjorn SVENSSON <[email protected]>
wrote:

> Hello!
>
> Thanks for the feedback Jeff.
>
> Regarding the alternative to using "__" prefix for the members; would it
> be better to move line 105-123 from newlib/libc/include/time.h to
> newlib/libc/time/local.h, thus not exposing it in the API?
>

Yes.  It was one of the alternatives I mentioned (hiding the struct from
users of time.h).  The struct is hidden in glibc and should have been
hidden likewise in newlib.

The lines in question are:
> typedef struct __tzrule_struct
> {
>   char ch;
>   int m;
>   int n;
>   int d;
>   int s;
>   time_t change;
>   long offset; /* Match type of _timezone. */
> } __tzrule_type;
>
> typedef struct __tzinfo_struct
> {
>   int __tznorth;
>   int __tzyear;
>   __tzrule_type __tzrule[2];
> } __tzinfo_type;
>
> __tzinfo_type *__gettzinfo (void);
>
>
>
> Would this change be easier to get accepted? If this approach is better, I
> guess the single letter member names can be kept too…
> While I took another look at the change, I also noticed that the struct
> definition (not usage) is also present in these files:
> newlib/libc/sys/linux/include/time.h
> newlib/libc/sys/phoenix/include/time.h
>
> I’m not sure in what situations those files are used and when the time.h
> file that I modified is used, but I guess they should be in sync regardless.
>
> Thanks
> Torbjörn
>
> From: Jeff Johnston <[email protected]>
> Sent: den 2 oktober 2020 01:21
> To: Torbjorn SVENSSON <[email protected]>
> Cc: Newlib <[email protected]>
> Subject: Re: [PATCH 3/3] libc: Replace one letter member names in
> __tzrule_struct
>
> Hello, while I fully agree there is an issue (the struct was due to my
> initial check-in in 2005 based on glibc), the change will break API and
> thus technically requires a major release bump of newlib.  I would prefer
> to wait for something else
> to require a major bump before making such a change.  In such a case, I
> also believe that the patch should either use double-underscores for the
> field names (e.g. __month) or hide the struct from regular users of time.h.
>
> -- Jeff J.
>
> On Thu, Oct 1, 2020 at 10:19 AM Torbjörn SVENSSON via Newlib <mailto:
> [email protected]> wrote:
> As discussed in GCC bug 97088
> (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97088), parameters in
> prototypes of library functions should use reserved names, or no name
> at all.
>
> This patch replaces 'm', 'n', 'd' and 's' members in
> 'struct __tzrule_struct' to avoid possible clashes with user code in
> case someone uses before including Newlib's time.h (or uses some
> other conflicting definition)
>
> Signed-off-by: Torbjörn SVENSSON <mailto:[email protected]>
> ---
>  newlib/libc/include/time.h       |  8 ++++----
>  newlib/libc/time/tzcalc_limits.c | 14 +++++++-------
>  newlib/libc/time/tzset_r.c       | 22 +++++++++++-----------
>  3 files changed, 22 insertions(+), 22 deletions(-)
>
> diff --git a/newlib/libc/include/time.h b/newlib/libc/include/time.h
> index 3031590b4..6a540537f 100644
> --- a/newlib/libc/include/time.h
> +++ b/newlib/libc/include/time.h
> @@ -105,10 +105,10 @@ void      _tzset_r        (struct _reent *);
>  typedef struct __tzrule_struct
>  {
>    char ch;
> -  int m;
> -  int n;
> -  int d;
> -  int s;
> +  int month; /* Month of year if ch=M */
> +  int week; /* Week of month if ch=M */
> +  int day; /* Day of week if ch=M, day of year if ch=J or ch=D */
> +  int secs; /* Time of day in seconds */
>    time_t change;
>    long offset; /* Match type of _timezone. */
>  } __tzrule_type;
> diff --git a/newlib/libc/time/tzcalc_limits.c
> b/newlib/libc/time/tzcalc_limits.c
> index e0ea6549c..b2163ed3d 100644
> --- a/newlib/libc/time/tzcalc_limits.c
> +++ b/newlib/libc/time/tzcalc_limits.c
> @@ -34,13 +34,13 @@ __tzcalc_limits (int year)
>        if (tz->__tzrule[i].ch == 'J')
>         {
>           /* The Julian day n (1 <= n <= 365). */
> -         days = year_days + tz->__tzrule[i].d +
> -           (isleap(year) && tz->__tzrule[i].d >= 60);
> +         days = year_days + tz->__tzrule[i].day +
> +           (isleap(year) && tz->__tzrule[i].day >= 60);
>           /* Convert to yday */
>           --days;
>         }
>        else if (tz->__tzrule[i].ch == 'D')
> -       days = year_days + tz->__tzrule[i].d;
> +       days = year_days + tz->__tzrule[i].day;
>        else
>         {
>           const int yleap = isleap(year);
> @@ -49,15 +49,15 @@ __tzcalc_limits (int year)
>
>           days = year_days;
>
> -         for (j = 1; j < tz->__tzrule[i].m; ++j)
> +         for (j = 1; j < tz->__tzrule[i].month; ++j)
>             days += ip[j-1];
>
>           m_wday = (EPOCH_WDAY + days) % DAYSPERWEEK;
>
> -         wday_diff = tz->__tzrule[i].d - m_wday;
> +         wday_diff = tz->__tzrule[i].day - m_wday;
>           if (wday_diff < 0)
>             wday_diff += DAYSPERWEEK;
> -         m_day = (tz->__tzrule[i].n - 1) * DAYSPERWEEK + wday_diff;
> +         m_day = (tz->__tzrule[i].week - 1) * DAYSPERWEEK + wday_diff;
>
>           while (m_day >= ip[j-1])
>             m_day -= DAYSPERWEEK;
> @@ -67,7 +67,7 @@ __tzcalc_limits (int year)
>
>        /* store the change-over time in GMT form by adding offset */
>        tz->__tzrule[i].change = days * SECSPERDAY +
> -      tz->__tzrule[i].s + tz->__tzrule[i].offset;
> +      tz->__tzrule[i].secs + tz->__tzrule[i].offset;
>      }
>
>    tz->__tznorth = (tz->__tzrule[0].change < tz->__tzrule[1].change);
> diff --git a/newlib/libc/time/tzset_r.c b/newlib/libc/time/tzset_r.c
> index 9e0cf834b..7117b51e6 100644
> --- a/newlib/libc/time/tzset_r.c
> +++ b/newlib/libc/time/tzset_r.c
> @@ -115,9 +115,9 @@ _tzset_unlocked_r (struct _reent *reent_ptr)
>             return;
>
>           tz->__tzrule[i].ch = 'M';
> -         tz->__tzrule[i].m = m;
> -         tz->__tzrule[i].n = w;
> -         tz->__tzrule[i].d = d;
> +         tz->__tzrule[i].month = m;
> +         tz->__tzrule[i].week = w;
> +         tz->__tzrule[i].day = d;
>
>           tzenv += n;
>         }
> @@ -142,22 +142,22 @@ _tzset_unlocked_r (struct _reent *reent_ptr)
>               if (i == 0)
>                 {
>                   tz->__tzrule[0].ch = 'M';
> -                 tz->__tzrule[0].m = 3;
> -                 tz->__tzrule[0].n = 2;
> -                 tz->__tzrule[0].d = 0;
> +                 tz->__tzrule[0].month = 3;
> +                 tz->__tzrule[0].week = 2;
> +                 tz->__tzrule[0].day = 0;
>                 }
>               else
>                 {
>                   tz->__tzrule[1].ch = 'M';
> -                 tz->__tzrule[1].m = 11;
> -                 tz->__tzrule[1].n = 1;
> -                 tz->__tzrule[1].d = 0;
> +                 tz->__tzrule[1].month = 11;
> +                 tz->__tzrule[1].week = 1;
> +                 tz->__tzrule[1].day = 0;
>                 }
>             }
>           else
>             {
>               tz->__tzrule[i].ch = ch;
> -             tz->__tzrule[i].d = d;
> +             tz->__tzrule[i].day = d;
>             }
>
>           tzenv = end;
> @@ -172,7 +172,7 @@ _tzset_unlocked_r (struct _reent *reent_ptr)
>        if (*tzenv == '/')
>         sscanf (tzenv, "/%hu%n:%hu%n:%hu%n", &hh, &n, &mm, &n, &ss, &n);
>
> -      tz->__tzrule[i].s = ss + SECSPERMIN * mm + SECSPERHOUR  * hh;
> +      tz->__tzrule[i].secs = ss + SECSPERMIN * mm + SECSPERHOUR  * hh;
>
>        tzenv += n;
>      }
> --
> 2.18.0
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.