Will do, I’ll send out a v6 this evening, thank you!

Andrew

On Wed, Aug 27, 2025 at 8:46 AM Daniel Kiper <daniel.ki...@oracle.com>
wrote:

> On Tue, Aug 26, 2025 at 09:11:09PM -0500, Andrew Hamilton wrote:
> > Support dates outside of 1901..2038.
> >
> > Fixes: https://savannah.gnu.org/bugs/?63894
> > Fixes: https://savannah.gnu.org/bugs/?66301
> >
> > Signed-off-by: Vladimir Serbinenko <phco...@gmail.com>
> > Signed-off-by: Andrew Hamilton <adham...@gmail.com>
> > ---
> >  grub-core/lib/datetime.c | 65 ++++++++++++++++++++++++++++++++--------
> >  include/grub/datetime.h  | 28 ++++++++++++-----
> >  2 files changed, 73 insertions(+), 20 deletions(-)
> >
> > diff --git a/grub-core/lib/datetime.c b/grub-core/lib/datetime.c
> > index 8f0922fb0..eb9a8d9c9 100644
> > --- a/grub-core/lib/datetime.c
> > +++ b/grub-core/lib/datetime.c
> > @@ -64,7 +64,10 @@ grub_get_weekday_name (struct grub_datetime *datetime)
> >  #define SECPERDAY (24*SECPERHOUR)
> >  #define DAYSPERYEAR 365
> >  #define DAYSPER4YEARS (4*DAYSPERYEAR+1)
> > -
> > +/* 24 leap years in 100 years */
> > +#define DAYSPER100YEARS (100 * DAYSPERYEAR + 24)
> > +/* 97 leap years in 400 years */
> > +#define DAYSPER400YEARS (400 * DAYSPERYEAR + 97)
> >
> >  void
> >  grub_unixtime2datetime (grub_int64_t nix, struct grub_datetime
> *datetime)
> > @@ -76,10 +79,12 @@ 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;
> > +  /* Tracks whether this is a leap year. */
> > +  bool bisextile;
> >
> >    /* Transform C divisions and modulos to mathematical ones */
> >    if (nix < 0)
> > @@ -92,27 +97,63 @@ 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;
> > +  /*
> > +   * 1970 is Unix Epoch. Adjust to a year 1 epoch:
> > +   *  Leap year logic:
> > +   *   - Years evenly divisible by 400 are leap years
> > +   *   - Otherwise, if divisible by 100 are not leap years
> > +   *   - Otherwise, if divisible by 4 are leap years
> > +   *  There are four 400-year periods (1600 years worth of days with
> leap days)
> > +   *  There are three 100-year periods worth of leap days (3*24)
>
> Please move this line one line below...
>
> > +   *  There are 369 years in addition to the four 400 year periods
> > +   *  There are 17 leap days in 69 years (beyond the three 100 year
> periods)
> > +   */
> > +  days = days_epoch + 369 * DAYSPERYEAR + 17 + 24 * 3 + 4 *
> DAYSPER400YEARS;
>
> days = 4 * DAYSPER400YEARS + 369 * DAYSPERYEAR + 3 * 24 + 17 + days_epoch;
>
> Then it is more readable...
>
> If you fix all these minor issues you can add my RB...
>
> Daniel
>
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to