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