Just checking on this again. I know people are busy so understand.

Thanks,
Andrew

On Sat, Oct 26, 2024 at 10:00 AM Andrew Hamilton <adham...@gmail.com> wrote:

> Just checking if this was still on the radar, seems mostly comment and
> type changes so maybe a relatively minor update?
>
> If any help is needed to make the adjustments let me know and I can help.
>
> Thanks,
> Andrew
>
> On Mon, Sep 2, 2024 at 11:14 AM Daniel Kiper <dki...@net-space.pl> wrote:
>
>> On Sat, Aug 17, 2024 at 08:30:22PM +0300, Vladimir Serbinenko wrote:
>> > Signed-off-by: Vladimir Serbinenko <phco...@gmail.com>
>> > ---
>> >  grub-core/lib/datetime.c | 31 ++++++++++++++++++++++++-------
>> >  include/grub/datetime.h  | 15 +++++++--------
>> >  2 files changed, 31 insertions(+), 15 deletions(-)
>> >
>> > diff --git a/grub-core/lib/datetime.c b/grub-core/lib/datetime.c
>> > index 9120128ca..e4bdc5c4f 100644
>> > --- a/grub-core/lib/datetime.c
>> > +++ b/grub-core/lib/datetime.c
>> > @@ -59,6 +59,8 @@ grub_get_weekday_name (struct grub_datetime *datetime)
>> >  #define SECPERDAY (24*SECPERHOUR)
>> >  #define DAYSPERYEAR 365
>> >  #define DAYSPER4YEARS (4*DAYSPERYEAR+1)
>> > +#define DAYSPER100YEARS (100*DAYSPERYEAR+24)
>> > +#define DAYSPER400YEARS (400*DAYSPERYEAR+97)
>> >
>> >
>> >  void
>> > @@ -71,7 +73,7 @@ grub_unixtime2datetime (grub_int64_t nix, struct
>> grub_datetime *datetime)
>> >    /* Convenience: let's have 3 consecutive non-bissextile years
>> >       at the beginning of the counting date. So count from 1901. */
>> >    int days_epoch;
>> > -  /* Number of days since 1st Januar, 1901.  */
>> > +  /* Number of days since 1st January, 1 (proleptic).  */
>> >    unsigned days;
>> >    /* Seconds into current day.  */
>> >    unsigned secs_in_day;
>> > @@ -87,9 +89,25 @@ grub_unixtime2datetime (grub_int64_t nix, struct
>> grub_datetime *datetime)
>> >      days_epoch = grub_divmod64 (nix, SECPERDAY, NULL);
>> >
>> >    secs_in_day = nix - days_epoch * SECPERDAY;
>> > -  days = days_epoch + 69 * DAYSPERYEAR + 17;
>> > +  days = days_epoch + 369 * DAYSPERYEAR + 17 + 24 * 3 + 4 *
>> DAYSPER400YEARS;
>>
>> I can imagine how this math was build but I would prefer if you add
>> a comment where these numbers come from...
>>
>> > -  datetime->year = 1901 + 4 * (days / DAYSPER4YEARS);
>> > +  datetime->year = 1 + 400 * (days / DAYSPER400YEARS);
>> > +  days %= DAYSPER400YEARS;
>> > +
>> > +  /* On 31st December of bissextile years 365 days from the beginning
>> > +     of the year elapsed but year isn't finished yet */
>>
>> I think the comment is not precise. It happens once per 400 years.
>> Right? I think it should be clarified.
>>
>> > +  if (days / DAYSPER100YEARS == 4)
>> > +    {
>> > +      datetime->year += 396;
>> > +      days -= 396*DAYSPERYEAR + 96;
>>
>> Where do these numbers come from? The math begs for comment.
>>
>> > +    }
>> > +  else
>> > +    {
>> > +      datetime->year += 100 * (days / DAYSPER100YEARS);
>> > +      days %= DAYSPER100YEARS;
>>
>> Ditto.
>>
>> > +    }
>> > +
>> > +  datetime->year += 4 * (days / DAYSPER4YEARS);
>> >    days %= DAYSPER4YEARS;
>> >    /* On 31st December of bissextile years 365 days from the beginning
>> >       of the year elapsed but year isn't finished yet */
>> > @@ -103,11 +121,10 @@ grub_unixtime2datetime (grub_int64_t nix, struct
>> grub_datetime *datetime)
>> >        datetime->year += days / DAYSPERYEAR;
>> >        days %= DAYSPERYEAR;
>> >      }
>> > +  int isbisextile = datetime->year % 4 == 0 && (datetime->year % 100
>> != 0 || datetime->year % 400 == 0);
>>
>> Could you use bool instead? And define variable at the beginning of
>> function?
>>
>> >    for (i = 0; i < 12
>> > -      && days >= (i==1 && datetime->year % 4 == 0
>> > -                   ? 29 : months[i]); i++)
>> > -    days -= (i==1 && datetime->year % 4 == 0
>> > -                         ? 29 : months[i]);
>> > +      && days >= (i==1 && isbisextile ? 29 : months[i]); i++)
>> > +    days -= (i==1 && isbisextile ? 29 : months[i]);
>> >    datetime->month = i + 1;
>> >    datetime->day = 1 + days;
>> >    datetime->hour = (secs_in_day / SECPERHOUR);
>> > diff --git a/include/grub/datetime.h b/include/grub/datetime.h
>> > index bcec636f0..9289b0d00 100644
>> > --- a/include/grub/datetime.h
>> > +++ b/include/grub/datetime.h
>> > @@ -54,7 +54,7 @@ void grub_unixtime2datetime (grub_int64_t nix,
>> >  static inline int
>> >  grub_datetime2unixtime (const struct grub_datetime *datetime,
>> grub_int64_t *nix)
>> >  {
>> > -  grub_int32_t ret;
>> > +  grub_int64_t ret;
>> >    int y4, ay;
>> >    const grub_uint16_t monthssum[12]
>> >      = { 0,
>> > @@ -75,15 +75,11 @@ grub_datetime2unixtime (const struct grub_datetime
>> *datetime, grub_int64_t *nix)
>> >    const int SECPERHOUR = 60 * SECPERMIN;
>> >    const int SECPERDAY = 24 * SECPERHOUR;
>> >    const int SECPERYEAR = 365 * SECPERDAY;
>> > -  const int SECPER4YEARS = 4 * SECPERYEAR + SECPERDAY;
>> > +  const grub_int64_t SECPER4YEARS = 4 * SECPERYEAR + SECPERDAY;
>> >
>> > -  if (datetime->year > 2038 || datetime->year < 1901)
>> > -    return 0;
>> >    if (datetime->month > 12 || datetime->month < 1)
>> >      return 0;
>> >
>> > -  /* In the period of validity of unixtime all years divisible by 4
>> > -     are bissextile*/
>> >    /* Convenience: let's have 3 consecutive non-bissextile years
>> >       at the beginning of the epoch. So count from 1973 instead of 1970
>> */
>> >    ret = 3 * SECPERYEAR + SECPERDAY;
>> > @@ -94,13 +90,16 @@ grub_datetime2unixtime (const struct grub_datetime
>> *datetime, grub_int64_t *nix)
>> >    ret += y4 * SECPER4YEARS;
>> >    ret += ay * SECPERYEAR;
>> >
>> > +  ret -= ((datetime->year - 1) / 100 - (datetime->year - 1) / 400 -
>> 15) * SECPERDAY;
>>
>> Again, please comment this math...
>>
>> >    ret += monthssum[datetime->month - 1] * SECPERDAY;
>> > -  if (ay == 3 && datetime->month >= 3)
>> > +  int isbisextile = ay == 3 && (datetime->year % 100 != 0 ||
>> datetime->year % 400 == 0);
>>
>> Ditto.
>>
>> And could you use bool instead of int?
>>
>> > +  if (isbisextile && datetime->month >= 3)
>> >      ret += SECPERDAY;
>> >
>> >    ret += (datetime->day - 1) * SECPERDAY;
>> >    if ((datetime->day > months[datetime->month - 1]
>> > -       && (!ay || datetime->month != 2 || datetime->day != 29))
>> > +       && !(isbisextile && datetime->month == 2 && datetime->day ==
>> 29))
>>
>> It would be nice to add a comment here too.
>>
>> Daniel
>>
>> _______________________________________________
>> Grub-devel mailing list
>> Grub-devel@gnu.org
>> https://lists.gnu.org/mailman/listinfo/grub-devel
>>
>
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to