From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.org/gmane.linux.lib.musl.general/13446 Path: news.gmane.org!.POSTED!not-for-mail From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= Newsgroups: gmane.linux.lib.musl.general Subject: [PATCH libc-test] add strptime basic test Date: Thu, 15 Nov 2018 08:34:56 +0100 Message-ID: <20181115073456.11105-1-zajec5@gmail.com> Reply-To: musl@lists.openwall.com NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Trace: blaine.gmane.org 1542267235 31279 195.159.176.226 (15 Nov 2018 07:33:55 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Thu, 15 Nov 2018 07:33:55 +0000 (UTC) Cc: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= To: musl@lists.openwall.com Original-X-From: musl-return-13462-gllmg-musl=m.gmane.org@lists.openwall.com Thu Nov 15 08:33:51 2018 Return-path: Envelope-to: gllmg-musl@m.gmane.org Original-Received: from mother.openwall.net ([195.42.179.200]) by blaine.gmane.org with smtp (Exim 4.84_2) (envelope-from ) id 1gNC9u-00083G-Tc for gllmg-musl@m.gmane.org; Thu, 15 Nov 2018 08:33:51 +0100 Original-Received: (qmail 26006 invoked by uid 550); 15 Nov 2018 07:35:58 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-ID: Original-Received: (qmail 25974 invoked from network); 15 Nov 2018 07:35:58 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=zyzyG5if2FpiV6l1EMNj5Zv4RnCo4Doikdm+7zVTOb0=; b=a3bLZIhEz4qPiBynO7TLIkDn/wHf7IMaf7W/0UJ4rZD7jknZvzv+ToKyLCc/fpALU+ QnmnFwhqn7Eg/uiAQ8KfktPxrx2ouj/9MKMoE82jHYql2jNsIawTX6k11GCGSTnJh2Vv EMPUaxpEyZ5xS6KDN9S4adLckN9W18e9V8uvcviJHetS3mQJUM09Z3pK2Fno5eEu8nAU cPY9LDKYdjCC+Qe3DvDQHuq9SFoLqhDHCnbV6nXuG0ORMp69EhmrilrtL8fv7dO2RV8C MUmcCvVolPAOR/tREajKmwIVdjh5MegQQ+jN6esZJrZa68O1Qfa3naADiu+DbppsBw5g vcQQ== 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:mime-version :content-transfer-encoding; bh=zyzyG5if2FpiV6l1EMNj5Zv4RnCo4Doikdm+7zVTOb0=; b=WLU3EFQDjSQOrv2SfzPSwANiZ+fItxpxa1Gi6ilBtREjkh4dJhKROJtbyd4ZI1kZAV KKxAxllF4W7AY2KcNkJeCAgmd4iESr0UfSr4GqIdf4hG5ufbUuH0XDr5QMaRzqYaZgcE saQ9BHCSm47OeKfyOy+BVvEyV0v2F7QQu/zEDnG/MjY6YtCl5M1VVHOajUZdB7OZOY7W ezDGP8AWqmIAY3jAmzeOhqMpbufd9uz4CAYSsPPE7hseCrCZU4uBGnUivkW+KXpxTTt1 1gOmxsvSrlR3/kSbm61Mog8UBtmsYm87GB4NRNLP6F1MgzzA//7ZD/ZZ0qc01QTxGE5T 1ziA== X-Gm-Message-State: AGRZ1gIS/YQPLj+YjhbF2Abrs/dHEOx9q3iF/zObW/O6/rtokMQJnKFG TMxzObomyVV61VQNxS8KzpFMw3Mm X-Google-Smtp-Source: AJdET5elI4CCR6OSgQSdTCcZbXZHGMl7OtG0dBx0knRf28WeD7cC7fHZBhV9yX10sR7s0+ewKRISgQ== X-Received: by 2002:a17:906:1353:: with SMTP id x19-v6mr4488784ejb.23.1542267346651; Wed, 14 Nov 2018 23:35:46 -0800 (PST) X-Mailer: git-send-email 2.13.7 Xref: news.gmane.org gmane.linux.lib.musl.general:13446 Archived-At: From: Rafał Miłecki Signed-off-by: Rafał Miłecki --- src/functional/strptime.c | 119 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 src/functional/strptime.c diff --git a/src/functional/strptime.c b/src/functional/strptime.c new file mode 100644 index 0000000..5f15058 --- /dev/null +++ b/src/functional/strptime.c @@ -0,0 +1,119 @@ +// SPDX-License-Identifier: MIT + +#define _GNU_SOURCE /* For tm_gmtoff */ +#include +#include +#include +#include +#include "test.h" + +static void checkStrptime(const char *s, const char *format, const struct tm *expected) { + size_t n = offsetof(struct tm, tm_isdst); + struct tm tm = { }; + const char *ret; + + ret = strptime(s, format, &tm); + if (!ret || *ret != '\0') { + t_error("\"%s\": failed to parse \"%s\"\n", format, s); + } else if (memcmp(&tm, expected, n)) { + char buf1[64]; + char buf2[64]; + + strftime(buf1, sizeof(buf1), "%FT%H:%M:%S%Z (day %j: %a)", expected); + strftime(buf2, sizeof(buf2), "%FT%H:%M:%S%Z (day %j: %a)", &tm); + + t_error("\"%s\": for \"%s\" expected %s but got %s\n", format, s, buf1, buf2); + } +} + +static void checkStrptimeTz(const char *s, int h, int m) { + long int expected = h * 3600 + m * 60; + struct tm tm = { }; + const char *ret; + + ret = strptime(s, "%z", &tm); + if (!ret || *ret != '\0') { + t_error("\"%%z\": failed to parse \"%s\"\n", s); + } else if (tm.tm_gmtoff != expected) { + t_error("\"%%z\": for \"%s\" expected tm_gmtoff %ld but got %ld\n", s, tm.tm_gmtoff, expected); + } +} + +static struct tm tm1 = { + .tm_sec = 8, + .tm_min = 57, + .tm_hour = 20, + .tm_mday = 0, + .tm_mon = 0, + .tm_year = 0, + .tm_wday = 0, + .tm_yday = 0, + .tm_isdst = 0, +}; + +static struct tm tm2 = { + .tm_sec = 0, + .tm_min = 0, + .tm_hour = 0, + .tm_mday = 25, + .tm_mon = 8 - 1, + .tm_year = 1991 - 1900, + .tm_wday = 0, + .tm_yday = 237 - 1, + .tm_isdst = 0, +}; + +static struct tm tm3 = { + .tm_sec = 0, + .tm_min = 0, + .tm_hour = 0, + .tm_mday = 21, + .tm_mon = 10 - 1, + .tm_year = 2015 - 1900, + .tm_wday = 3, + .tm_yday = 294 - 1, + .tm_isdst = 0, +}; + +static struct tm tm4 = { + .tm_sec = 0, + .tm_min = 0, + .tm_hour = 0, + .tm_mday = 10, + .tm_mon = 7 - 1, + .tm_year = 1856 - 1900, + .tm_wday = 4, + .tm_yday = 192 - 1, + .tm_isdst = 0, +}; + +int main() { + setenv("TZ", "UTC0", 1); + + /* Time */ + checkStrptime("20:57:08", "%H:%M:%S", &tm1); + checkStrptime("20:57:8", "%R:%S", &tm1); + checkStrptime("20:57:08", "%T", &tm1); + + /* Format */ + checkStrptime("20:57:08", "%H : %M : %S", &tm1); + checkStrptime("20 57 08", "%H %M %S", &tm1); + checkStrptime("20%57%08", "%H %% %M%%%S", &tm1); + checkStrptime("foo20bar57qux08 ", "foo %Hbar %M qux%S ", &tm1); + + /* Date */ + checkStrptime("1991-08-25", "%Y-%m-%d", &tm2); + checkStrptime("25.08.91", "%d.%m.%y", &tm2); + checkStrptime("08/25/91", "%D", &tm2); + checkStrptime("21.10.15", "%d.%m.%y", &tm3); + checkStrptime("10.7.56 in 18th", "%d.%m.%y in %C th", &tm4); + + /* Glibc */ + checkStrptime("1856-07-10", "%F", &tm4); + checkStrptime("683078400", "%s", &tm2); + checkStrptimeTz("+0200", 2, 0); + checkStrptimeTz("-0530", -5, -30); + checkStrptimeTz("-06", -6, 0); + + return t_status; +} -- 2.13.7