Hi Vladimir, I can make an attempt at addressing Daniel's comments if that's okay - any objections?
Thanks, Andrew On Thu, Dec 19, 2024 at 11:34 AM Andrew Hamilton <adham...@gmail.com> wrote: > 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