From patchwork Fri Apr 24 15:07:29 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?xJBvw6BuIFRy4bqnbiBDw7RuZyBEYW5o?= X-Patchwork-Id: 11508055 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 1C17092C for ; Fri, 24 Apr 2020 15:07:43 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 037FD2075A for ; Fri, 24 Apr 2020 15:07:43 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="rse2FujX" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727108AbgDXPHm (ORCPT ); Fri, 24 Apr 2020 11:07:42 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48422 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1726707AbgDXPHl (ORCPT ); Fri, 24 Apr 2020 11:07:41 -0400 Received: from mail-pj1-x1043.google.com (mail-pj1-x1043.google.com [IPv6:2607:f8b0:4864:20::1043]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 71727C09B045 for ; Fri, 24 Apr 2020 08:07:41 -0700 (PDT) Received: by mail-pj1-x1043.google.com with SMTP id a5so3973621pjh.2 for ; Fri, 24 Apr 2020 08:07:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=E6Pa10RZbqUp9fkgDKJ5iLiLAKb3oXXpq5PDrmLBUk0=; b=rse2FujXuq1FXPAADtwUJKBL+qrfJEa0DbqD8od19nzH7biPooXJlpO9hMjVeXLStD yoCED3CIeGc4+QYWddagtEZhDcwG8HLESIfdrk46PaUmli9ZwNWhuojFs+PxEl0BvIyJ FCGPFTaV1XLi8CoGbHBDoaNrPnk14weyb/bGAScq7fWiBWeHyjytL3Pio1zlpjWuwgMz IQp16TKGaam/oGcDk2Eras/YjNCuWsJrygDE6tcrfDfWcWYyQGzxpGRptbfV9SFztL4r +1SB5tlHceF9p8y3q6Wup8mFhZYAMMHXoLj7LwOzRSvTuiOqPlAaUBHuPgOx7FXnOoKC PRMw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=E6Pa10RZbqUp9fkgDKJ5iLiLAKb3oXXpq5PDrmLBUk0=; b=sAfbRecS1wgSFQgiPxVu+yJ73VsQAddS7LRIf4vFm2BHQnNfrWYPfGcrG1yYDnUeh0 fx/jgskz8rww6xjuEufmawyfEOCkwFG+9OjJnRfkQnjZ5Ql+1H1WolYahgbnHycrShbr WFYj1pKWyNrrJJ/l3s+6tZBZXiKgJiu3szcwwB/nZdHxeEiIE+GDdT/Tq7tLP9vlfRPI l6NIvMd46fZ4/mEZ0mHYO0p3013IWNivpK/46E3zjph8IdsRW4L2FbGv19tI1M6egMh8 /JyI/5KOrfM+xBHUPCIKDBSzR+pQQT+TXbHNq6YzWQ+NuP6ZJUuFvbTBm753cRIzh3sO 9xwA== X-Gm-Message-State: AGi0PuaAhIm8kw9s2J3Le0RJgZDXQPD3MsN+DvhQ5h/kdPdWRMGamHJp PfGmBG30+AFvett1w0pAS/5o9ih9 X-Google-Smtp-Source: APiQypLVoaLBnKZy+QoMbMeS+Sb51cOZbyGP+15PPJZIXMM4yx2DY7bgWVKH5eJSQcTlyg+OXdtbBQ== X-Received: by 2002:a17:902:9004:: with SMTP id a4mr8915062plp.275.1587740860747; Fri, 24 Apr 2020 08:07:40 -0700 (PDT) Received: from localhost.localdomain ([2402:800:6374:f359:1ce8:a621:5f80:1116]) by smtp.gmail.com with ESMTPSA id c84sm6417052pfb.153.2020.04.24.08.07.39 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 24 Apr 2020 08:07:40 -0700 (PDT) From: =?utf-8?b?xJBvw6BuIFRy4bqnbiBDw7RuZyBEYW5o?= To: git@vger.kernel.org Cc: =?utf-8?b?xJBvw6BuIFRy4bqnbiBDw7RuZyBEYW5o?= Subject: [PATCH v5 1/4] date.c: s/is_date/set_date/ Date: Fri, 24 Apr 2020 22:07:29 +0700 Message-Id: <1fe69008fc79e6a74e8613011504bc7e342291ab.1587740682.git.congdanhqx@gmail.com> X-Mailer: git-send-email 2.26.2.384.g435bf60bd5 In-Reply-To: References: MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org The function is_date, confusingly also set tm_year. tm_mon, and tm_mday after validating input. Rename to set_date to reflect its real usage. Also, change return value is 0 on success and -1 on failure following our convention on function do some real work. Signed-off-by: Đoàn Trần Công Danh --- date.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/date.c b/date.c index b0d9a8421d..b67c5abe24 100644 --- a/date.c +++ b/date.c @@ -497,7 +497,7 @@ static int match_alpha(const char *date, struct tm *tm, int *offset) return skip_alpha(date); } -static int is_date(int year, int month, int day, struct tm *now_tm, time_t now, struct tm *tm) +static int set_date(int year, int month, int day, struct tm *now_tm, time_t now, struct tm *tm) { if (month > 0 && month < 13 && day > 0 && day < 32) { struct tm check = *tm; @@ -518,9 +518,9 @@ static int is_date(int year, int month, int day, struct tm *now_tm, time_t now, else if (year < 38) r->tm_year = year + 100; else - return 0; + return -1; if (!now_tm) - return 1; + return 0; specified = tm_to_time_t(r); @@ -529,14 +529,14 @@ static int is_date(int year, int month, int day, struct tm *now_tm, time_t now, * sure it is not later than ten days from now... */ if ((specified != -1) && (now + 10*24*3600 < specified)) - return 0; + return -1; tm->tm_mon = r->tm_mon; tm->tm_mday = r->tm_mday; if (year != -1) tm->tm_year = r->tm_year; - return 1; + return 0; } - return 0; + return -1; } static int match_multi_number(timestamp_t num, char c, const char *date, @@ -575,10 +575,10 @@ static int match_multi_number(timestamp_t num, char c, const char *date, if (num > 70) { /* yyyy-mm-dd? */ - if (is_date(num, num2, num3, NULL, now, tm)) + if (set_date(num, num2, num3, NULL, now, tm) == 0) break; /* yyyy-dd-mm? */ - if (is_date(num, num3, num2, NULL, now, tm)) + if (set_date(num, num3, num2, NULL, now, tm) == 0) break; } /* Our eastern European friends say dd.mm.yy[yy] @@ -586,14 +586,14 @@ static int match_multi_number(timestamp_t num, char c, const char *date, * mm/dd/yy[yy] form only when separator is not '.' */ if (c != '.' && - is_date(num3, num, num2, refuse_future, now, tm)) + set_date(num3, num, num2, refuse_future, now, tm) == 0) break; /* European dd.mm.yy[yy] or funny US dd/mm/yy[yy] */ - if (is_date(num3, num2, num, refuse_future, now, tm)) + if (set_date(num3, num2, num, refuse_future, now, tm) == 0) break; /* Funny European mm.dd.yy */ if (c == '.' && - is_date(num3, num, num2, refuse_future, now, tm)) + set_date(num3, num, num2, refuse_future, now, tm) == 0) break; return 0; } From patchwork Fri Apr 24 15:07:30 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?xJBvw6BuIFRy4bqnbiBDw7RuZyBEYW5o?= X-Patchwork-Id: 11508057 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id C919D1575 for ; Fri, 24 Apr 2020 15:07:44 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id B251D2075A for ; Fri, 24 Apr 2020 15:07:44 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="DxozZgMf" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727779AbgDXPHn (ORCPT ); Fri, 24 Apr 2020 11:07:43 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48430 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1726707AbgDXPHn (ORCPT ); Fri, 24 Apr 2020 11:07:43 -0400 Received: from mail-pj1-x1041.google.com (mail-pj1-x1041.google.com [IPv6:2607:f8b0:4864:20::1041]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2CC47C09B045 for ; Fri, 24 Apr 2020 08:07:43 -0700 (PDT) Received: by mail-pj1-x1041.google.com with SMTP id a5so3973653pjh.2 for ; Fri, 24 Apr 2020 08:07:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=6FMNth40AlDOhVFhvSbiwCFY2eVihWdAM/UgMz7Xh3U=; b=DxozZgMfNId4ikeruPebzoQuzwv98mWSpXbYICiQlYimcq+EBTf6Q1if/p7pEg5d2M 0JKebiKZ3BVU74HJHIh9OrKJGE80tzdHCvgoWReQiCXlN555vcc9qUzKsYtcfCJxJRYJ Zo6nqHQdb7a4Xy/X8SAAoeLk9O4Mz9ZrUsIn+EJrmOe77H8tEUVqqbjkKi/qs8tRunwf pcPfm0oA7nkdPONM48tPuBGXGL0uiQizoZsez1RzlO8SdVuLBXmF4tL3AOtByH/6pHxA mHGw8NTtjqw+dmvq9pcOY/sQ5pkz7CXiIiRVINUUC83tpBouKjfP3qV5VAmJ5BIKF3Os QxAA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=6FMNth40AlDOhVFhvSbiwCFY2eVihWdAM/UgMz7Xh3U=; b=nwIiGdaF+X5vqaVChx+PZmU4WnyDXq+Hsd5hL7TphXPLk0yYZLeWw3iG4YGo6fK/VK luVOvtKWxGZ78/u6SGFOOzve8Jyn32QYR0KyJolBBoFMOE47N4lO8Qo6InSmwjHre92U /GRLb8dThNXiUkyhZk8WCQCIblVq2uTRpg6o0iT5pbRJfzVBn5XKmleQpz682LRpmc9q wLBcWt80kNWMEaIoUKhfKUGxf++ClZvmMnV6CEAIYZiyKAPK4oYdvVrdor1P2vVE7Xt3 2g63mReKDD66SfMzYJXuddXqDj+LdQFZ3be4/14jIfdzVhLTqtUBXe7ZhYsHQCXnsf5E RfFA== X-Gm-Message-State: AGi0PuZQVxeSeAPCB4x6PENEj9g2ND513t0XhB087w5ZRMfLGg7YtgQv Ann83Heg3BX1sTqp7CfhhNFemmOn X-Google-Smtp-Source: APiQypLHwQApfq+8B13AimmFp+d9fHnYp5zrw5I99Jks2Gafz+aMRL5pBHaTINb8O5fzezkOZgECqA== X-Received: by 2002:a17:902:e905:: with SMTP id k5mr4356945pld.232.1587740862465; Fri, 24 Apr 2020 08:07:42 -0700 (PDT) Received: from localhost.localdomain ([2402:800:6374:f359:1ce8:a621:5f80:1116]) by smtp.gmail.com with ESMTPSA id c84sm6417052pfb.153.2020.04.24.08.07.41 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 24 Apr 2020 08:07:41 -0700 (PDT) From: =?utf-8?b?xJBvw6BuIFRy4bqnbiBDw7RuZyBEYW5o?= To: git@vger.kernel.org Cc: =?utf-8?b?xJBvw6BuIFRy4bqnbiBDw7RuZyBEYW5o?= Subject: [PATCH v5 2/4] date.c: validate and set time in a helper function Date: Fri, 24 Apr 2020 22:07:30 +0700 Message-Id: X-Mailer: git-send-email 2.26.2.384.g435bf60bd5 In-Reply-To: References: MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org 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 old-and-defective 2nd leap second. Signed-off-by: Đoàn Trần Công Danh --- Notes: I intentionally leave a pair of bracket around if (set_time(...)) to reduce the noise in next patch date.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/date.c b/date.c index b67c5abe24..fa39e5e8a5 100644 --- a/date.c +++ b/date.c @@ -539,6 +539,20 @@ 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) +{ + /* We accept 61st second because of leap second */ + 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; +} + static int match_multi_number(timestamp_t num, char c, const char *date, char *end, struct tm *tm, time_t now) { @@ -556,10 +570,7 @@ 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; From patchwork Fri Apr 24 15:07:31 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?xJBvw6BuIFRy4bqnbiBDw7RuZyBEYW5o?= X-Patchwork-Id: 11508061 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 55F9492C for ; Fri, 24 Apr 2020 15:07:47 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 3DFA82075A for ; Fri, 24 Apr 2020 15:07:47 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="k6y/2E3y" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727819AbgDXPHq (ORCPT ); Fri, 24 Apr 2020 11:07:46 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48436 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1726707AbgDXPHp (ORCPT ); Fri, 24 Apr 2020 11:07:45 -0400 Received: from mail-pf1-x443.google.com (mail-pf1-x443.google.com [IPv6:2607:f8b0:4864:20::443]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 95418C09B045 for ; Fri, 24 Apr 2020 08:07:45 -0700 (PDT) Received: by mail-pf1-x443.google.com with SMTP id w65so4906885pfc.12 for ; Fri, 24 Apr 2020 08:07:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=hSgIdBrblGujAom4AvXN2fkyFzuwohyV2jwW3Uz01ZA=; b=k6y/2E3y/Guutfm3TRjN8+HI3BbbAWYgeF1PhckHAEGv/6SQtSGNPpylI/ZryHFl5j +xfUV3vOmcWuth7V8ub+v/LIr1C53xCRpRtFB/jmWkFsCefWNDoz3zkj2qJQvwZ8vBSJ 1ibmm0HfT7GpN3JeUaNm0B4gWQS2OzuXNiaOfV+dPzSQmk3sTJQ/u2ffkW5BSP/CPxW7 BXJCoxmwv1Gkre1OnAI4/EMlu8Xnprzx7KLseKeqHka5TRnvJ+YWiqrapf1oZVkAc727 CGNy1C0+gxM0O0L4qZTfEYDXWMu/V0i4/I9UJ2noWOkbswse+Bu8jHhTYJr5S1SBuFiO DByw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=hSgIdBrblGujAom4AvXN2fkyFzuwohyV2jwW3Uz01ZA=; b=hEW/rBJuxN8Cm2dYkFN3PozXnVcih4ULmo28SlEElE/qCB9qAfqw56kT1CtSXxmy8Y 4cdN+1iJHVqPR01VA6LTMff0kczOiOUPjhEAQJIQDgc1KwGcJxEFDeRYBWTYMLe51EPy onlZ+UwUit1Lo/FiwAn4ihPvp1vQXKipTRaBpGwC9OZAciAYlkwu1rPfdABM22FJ4lMO cOucZqmsKNjoKUntIla44txYSN2uRZYZxFuJHc8nAs7xDRIdGoTcYCTcuHD3glkgTeGf zKG1/3NaxIWlljCNmw01PcBb64TddftMMPHuTTDrvSWOX/jmSv4rLuPmNHfnEJad/9A1 pjzQ== X-Gm-Message-State: AGi0Pua/X65waX5CJxgQ/UVXnvDVvmKC7tROE4W/b75zGTS5RfqMJYL/ EYWgS0mJjPkji62dnv0G1v2JFStExlY= X-Google-Smtp-Source: APiQypLHY37cey7n6jbYONmFsQSkvg+qb1LOARL/gkJF7VX29ZxeAoJj3hT6Inb7s37tfaWtcoYnTg== X-Received: by 2002:a63:4a59:: with SMTP id j25mr9417432pgl.336.1587740864760; Fri, 24 Apr 2020 08:07:44 -0700 (PDT) Received: from localhost.localdomain ([2402:800:6374:f359:1ce8:a621:5f80:1116]) by smtp.gmail.com with ESMTPSA id c84sm6417052pfb.153.2020.04.24.08.07.42 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 24 Apr 2020 08:07:44 -0700 (PDT) From: =?utf-8?b?xJBvw6BuIFRy4bqnbiBDw7RuZyBEYW5o?= To: git@vger.kernel.org Cc: =?utf-8?b?xJBvw6BuIFRy4bqnbiBDw7RuZyBEYW5o?= , "Brian M . Carlson" , Junio C Hamano Subject: [PATCH v5 3/4] date.c: skip fractional second part of ISO-8601 Date: Fri, 24 Apr 2020 22:07:31 +0700 Message-Id: X-Mailer: git-send-email 2.26.2.384.g435bf60bd5 In-Reply-To: References: MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org git-commit(1) says ISO-8601 is one of our supported date format. ISO-8601 allows timestamps to have a fractional number of seconds. We represent time only in terms of whole seconds, so we never bothered parsing fractional seconds. However, it's better for us to parse and throw away the fractional part than to refuse to parse the timestamp at all. And refusing parsing fractional second part may confuse the parse to think fractional and timezone as day and month in this example: 2008-02-14 20:30:45.019-04:00 While doing this, make sure that we only interpret the number after the second and the dot as fractional when and only when the date is known, since only ISO-8601 allows the fractional part, and we've taught our users to interpret "12:34:56.7.days.ago" as a way to specify a time relative to current time. Reported-by: Brian M. Carlson Helped-by: Junio C Hamano Signed-off-by: Đoàn Trần Công Danh --- Documentation/date-formats.txt | 5 ++++- date.c | 12 ++++++++++++ t/t0006-date.sh | 3 +++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/Documentation/date-formats.txt b/Documentation/date-formats.txt index 6926e0a4c8..7e7eaba643 100644 --- a/Documentation/date-formats.txt +++ b/Documentation/date-formats.txt @@ -20,7 +20,10 @@ RFC 2822:: ISO 8601:: Time and date specified by the ISO 8601 standard, for example `2005-04-07T22:13:13`. The parser accepts a space instead of the - `T` character as well. + `T` character as well. Fractional parts of a second will be ignored, + for example `2005-04-07T22:13:13.019` will be treated as + `2005-04-07T22:13:13` + + NOTE: In addition, the date part is accepted in the following formats: `YYYY.MM.DD`, `MM/DD/YYYY` and `DD.MM.YYYY`. diff --git a/date.c b/date.c index fa39e5e8a5..2c9071d53f 100644 --- a/date.c +++ b/date.c @@ -553,6 +553,11 @@ static int set_time(long hour, long minute, long second, struct tm *tm) return -1; } +static int is_date_known(struct tm *tm) +{ + return tm->tm_year != -1 && tm->tm_mon != -1 && tm->tm_mday != -1; +} + static int match_multi_number(timestamp_t num, char c, const char *date, char *end, struct tm *tm, time_t now) { @@ -571,6 +576,13 @@ static int match_multi_number(timestamp_t num, char c, const char *date, if (num3 < 0) num3 = 0; if (set_time(num, num2, num3, tm) == 0) { + /* + * If %H:%M:%S was just parsed followed by: . + * Consider (& discard) it as fractional second + * if %Y%m%d is parsed before. + */ + if (*end == '.' && isdigit(end[1]) && is_date_known(tm)) + strtol(end + 1, &end, 10); break; } return 0; diff --git a/t/t0006-date.sh b/t/t0006-date.sh index d9fcc829a9..80917c81c3 100755 --- a/t/t0006-date.sh +++ b/t/t0006-date.sh @@ -81,6 +81,8 @@ check_parse 2008-02 bad check_parse 2008-02-14 bad check_parse '2008-02-14 20:30:45' '2008-02-14 20:30:45 +0000' check_parse '2008-02-14 20:30:45 -0500' '2008-02-14 20:30:45 -0500' +check_parse '2008.02.14 20:30:45 -0500' '2008-02-14 20:30:45 -0500' +check_parse '2008-02-14 20:30:45.019-04:00' '2008-02-14 20:30:45 -0400' check_parse '2008-02-14 20:30:45 -0015' '2008-02-14 20:30:45 -0015' check_parse '2008-02-14 20:30:45 -5' '2008-02-14 20:30:45 +0000' check_parse '2008-02-14 20:30:45 -5:' '2008-02-14 20:30:45 +0000' @@ -103,6 +105,7 @@ check_approxidate 5.seconds.ago '2009-08-30 19:19:55' check_approxidate 10.minutes.ago '2009-08-30 19:10:00' check_approxidate yesterday '2009-08-29 19:20:00' check_approxidate 3.days.ago '2009-08-27 19:20:00' +check_approxidate '12:34:56.3.days.ago' '2009-08-27 12:34:56' check_approxidate 3.weeks.ago '2009-08-09 19:20:00' check_approxidate 3.months.ago '2009-05-30 19:20:00' check_approxidate 2.years.3.months.ago '2007-05-30 19:20:00' From patchwork Fri Apr 24 15:07:32 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?xJBvw6BuIFRy4bqnbiBDw7RuZyBEYW5o?= X-Patchwork-Id: 11508063 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 69BC592C for ; Fri, 24 Apr 2020 15:07:49 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 5151D20767 for ; Fri, 24 Apr 2020 15:07:49 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Ej/tTNeM" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727886AbgDXPHs (ORCPT ); Fri, 24 Apr 2020 11:07:48 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48446 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1727840AbgDXPHr (ORCPT ); Fri, 24 Apr 2020 11:07:47 -0400 Received: from mail-pl1-x630.google.com (mail-pl1-x630.google.com [IPv6:2607:f8b0:4864:20::630]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 30247C09B045 for ; Fri, 24 Apr 2020 08:07:47 -0700 (PDT) Received: by mail-pl1-x630.google.com with SMTP id k18so3834550pll.6 for ; Fri, 24 Apr 2020 08:07:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=UPYz0zycP2foz0E7INOMbi+3tdO5UF5ESfdL7FkXwI4=; b=Ej/tTNeMhXOZxwhVnEjpPOE9dx7cbWNMMmCQsIeTZb6E3P2BBu6jzeJKHO8fCc91hx JeZeCkYp4sVyviJoW1N0BWqZp+JVyog8kS0Ej+GtI+0sQRzHCKKtavGql7EoDkQBLBxw dMNY4C+pXv+MQv/XLKO57wXfgVDmgvI942W4Ppmn1P9MhgJok7vr8/LlDnoV2q30VUDy uIkAJLO/B7QQV4kCFfcvXYRpHsNAU5OQm+cw46vtIl0zDra60ZeyAslLD9y4VDyVFfd0 A0l6dIUekzuW3oFaaZQVhHtPwYmSkouFYtsa0pGM6dfE5V886IbyB+rfzYgXw5A+v8jJ VV1w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=UPYz0zycP2foz0E7INOMbi+3tdO5UF5ESfdL7FkXwI4=; b=FqqcXcC2fu9GBPJuxPW2W2xJ/evQQSOeUBDkoj/Emjvkm+i/UIVnaaXpRonvYounPY 2+rePDR3v9Ft/n88otRAatu1/qf4wv3CjqNios7MOWgHTJCLLM7qni+nWevcC7fCUgfb V7ZXYK3khRlfpXnvV3PGpth/vHO1nZA8+SIZQVhbdelRfFw6x0CUh6BuCPXIab9xd6DI +fTp65pvmyM7oSqngqDwbPX1AJNlR5T8CIxc6LugyfJ+395LRjfz/R/y6a8O6RkOip+r c3CHn/m8KqxIqk9AV6TImLZjOe5h8pf6x8sUjWM5jup5v4YrAa7uEBjkooYF9+dPCeJY zvgQ== X-Gm-Message-State: AGi0PuYyXI7LWykls7Dllz8uwpO3CokLh+PruvGsp5b/macEiAKlfTzL YB8JVZcTp5xLtvlTdN4WRLdGiPrH X-Google-Smtp-Source: APiQypKJHkTk4mUybaz4YDJTgFhvV0d2MKZeRet4M4f6l2po+UivgQx16knak2WNzyVR24wCwairVA== X-Received: by 2002:a17:902:9b95:: with SMTP id y21mr9698959plp.101.1587740866411; Fri, 24 Apr 2020 08:07:46 -0700 (PDT) Received: from localhost.localdomain ([2402:800:6374:f359:1ce8:a621:5f80:1116]) by smtp.gmail.com with ESMTPSA id c84sm6417052pfb.153.2020.04.24.08.07.45 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 24 Apr 2020 08:07:45 -0700 (PDT) From: =?utf-8?b?xJBvw6BuIFRy4bqnbiBDw7RuZyBEYW5o?= To: git@vger.kernel.org Cc: =?utf-8?b?xJBvw6BuIFRy4bqnbiBDw7RuZyBEYW5o?= Subject: [PATCH v5 4/4] date.c: allow compact version of ISO-8601 datetime Date: Fri, 24 Apr 2020 22:07:32 +0700 Message-Id: <51aa60c06965e86d30619006f9f431e4f8281104.1587740682.git.congdanhqx@gmail.com> X-Mailer: git-send-email 2.26.2.384.g435bf60bd5 In-Reply-To: References: MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Signed-off-by: Đoàn Trần Công Danh --- date.c | 14 ++++++++++++++ t/t0006-date.sh | 3 +++ 2 files changed, 17 insertions(+) diff --git a/date.c b/date.c index 2c9071d53f..f9ea807b3a 100644 --- a/date.c +++ b/date.c @@ -687,6 +687,20 @@ static int match_digit(const char *date, struct tm *tm, int *offset, int *tm_gmt n++; } while (isdigit(date[n])); + /* 8 digits, compact style of ISO-8601's date: YYYYmmDD */ + /* 6 digits, compact style of ISO-8601's time: HHMMSS */ + if (n == 8 || n == 6) { + unsigned int num1 = num / 10000; + unsigned int num2 = (num % 10000) / 100; + unsigned int num3 = num % 100; + if (n == 8) + set_date(num1, num2, num3, NULL, time(NULL), tm); + else if (n == 6 && set_time(num1, num2, num3, tm) == 0 && + *end == '.' && isdigit(end[1])) + strtoul(end + 1, &end, 10); + return end - date; + } + /* Four-digit year or a timezone? */ if (n == 4) { if (num <= 1400 && *offset == -1) { diff --git a/t/t0006-date.sh b/t/t0006-date.sh index 80917c81c3..75ee9a96b8 100755 --- a/t/t0006-date.sh +++ b/t/t0006-date.sh @@ -82,6 +82,9 @@ check_parse 2008-02-14 bad check_parse '2008-02-14 20:30:45' '2008-02-14 20:30:45 +0000' check_parse '2008-02-14 20:30:45 -0500' '2008-02-14 20:30:45 -0500' check_parse '2008.02.14 20:30:45 -0500' '2008-02-14 20:30:45 -0500' +check_parse '20080214T203045-04:00' '2008-02-14 20:30:45 -0400' +check_parse '20080214T203045 -04:00' '2008-02-14 20:30:45 -0400' +check_parse '20080214T203045.019-04:00' '2008-02-14 20:30:45 -0400' check_parse '2008-02-14 20:30:45.019-04:00' '2008-02-14 20:30:45 -0400' check_parse '2008-02-14 20:30:45 -0015' '2008-02-14 20:30:45 -0015' check_parse '2008-02-14 20:30:45 -5' '2008-02-14 20:30:45 +0000'