On 2020-04-23 13:18:25-0700, Junio C Hamano <gitster@xxxxxxxxx> wrote: > Đoàn Trần Công Danh <congdanhqx@xxxxxxxxx> writes: > > > In a later patch, we will reuse this logic, move it to a helper, now. > > > > While we're at it, explicit states that we intentionally ignore > > "explicitly state", perhaps. > > > old-and-defective 2nd leap second. > > > > Signed-off-by: Đoàn Trần Công Danh <congdanhqx@xxxxxxxxx> > > --- > > date.c | 22 +++++++++++++++++----- > > 1 file changed, 17 insertions(+), 5 deletions(-) > > > > diff --git a/date.c b/date.c > > index b67c5abe24..f5d5a91208 100644 > > --- a/date.c > > +++ b/date.c > > @@ -539,6 +539,22 @@ static int set_date(int year, int month, int day, struct tm *now_tm, time_t now, > > return -1; > > } > > > > +static int set_time(long hour, long minute, long second, struct tm *tm) > > +{ > > + /* C90 and old POSIX accepts 2 leap seconds, it's a defect, > > + * ignore second number 61 > > + */ > > /* > * Style: our multi-line comments ought to be > * formatted like this. Slash-asterisk that opens, > * and asterisk-slash that closes, are both on their > * own lines. > */ > > But I am not sure we want to even have a new comment here. After > all we are extracting/reinventing exactly the same logic as the > original. Why we allow "60" might be worth commenting, but if a > minute that has 62 seconds is a mere historical curiosity, then is > it worth explaining why "61", which we never even wrote in the code, > is missing from here? I think single line like: /* We accept 61st second for the single? leap second */ Or something along the time, is good enough. Not sure if we want the word "single" there, though. I think majority of people don't even know about leap second. Probability that know about 62nd second is rarer, I think. > > + if (0 <= hour && hour <= 24 && > > + 0 <= minute && minute < 60 && > > + 0 <= second && second <= 60) { > > + tm->tm_hour = hour; > > + tm->tm_min = minute; > > + tm->tm_sec = second; > > + return 0; > > + } > > + return -1; > > +} > > I am a bit surprised to see that you chose to unify with the "check > and set" interface of is_date (now set_date). I was expecting to > see that we'd have "check-only" helper functions. > > This is not a complaint, at least not yet until we see the result of > using it in new code; it may very well be possible that the "check > and set" interface would make the new caller(s) clearer. > > > static int match_multi_number(timestamp_t num, char c, const char *date, > > char *end, struct tm *tm, time_t now) > > { > > @@ -556,12 +572,8 @@ static int match_multi_number(timestamp_t num, char c, const char *date, > > case ':': > > if (num3 < 0) > > num3 = 0; > > - if (num < 25 && num2 >= 0 && num2 < 60 && num3 >= 0 && num3 <= 60) { > > - tm->tm_hour = num; > > - tm->tm_min = num2; > > - tm->tm_sec = num3; > > + if (set_time(num, num2, num3, tm) == 0) > > break; > > - } > > return 0; > > This caller does become easier to follow, I would say. Nicely done. Yes, when I looked around date.c I saw that the only usecase for validate time is for setting it. And the incoming patch also has that usage. I chose to unify those code path to not buy me too much trouble. I'll take that "Nicely done" means this unification is OK for this series. -- Danh