From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
To: Alessandro Zummo <a.zummo@towertech.it>,
Alexandre Belloni <alexandre.belloni@bootlin.com>,
linux-rtc@vger.kernel.org, Arnd Bergmann <arnd@arndb.de>,
Joe Perches <joe@perches.com>, Mark Salyzyn <salyzyn@android.com>,
Geert Uytterhoeven <geert@linux-m68k.org>,
linux-kernel@vger.kernel.org,
Rasmus Villemoes <rasmus.villemoes@prevas.dk>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>,
Dmitry Torokhov <dmitry.torokhov@gmail.com>,
Guan Xuetao <gxt@mprc.pku.edu.cn>, Ingo Molnar <mingo@kernel.org>,
Jason Wessel <jason.wessel@windriver.com>,
Jonathan Corbet <corbet@lwn.net>,
Jonathan Hunter <jonathanh@nvidia.com>,
Krzysztof Kozlowski <krzk@kernel.org>,
"Rafael J. Wysocki" <rjw@rjwysocki.net>,
Thierry Reding <thierry.reding@gmail.com>,
Petr Mladek <pmladek@suse.com>
Subject: [PATCH v5 02/21] lib/vsprintf: Print time and date in human readable format via %pt
Date: Thu, 29 Nov 2018 12:59:40 +0200 [thread overview]
Message-ID: <20181129105956.25933-3-andriy.shevchenko@linux.intel.com> (raw)
In-Reply-To: <20181129105956.25933-1-andriy.shevchenko@linux.intel.com>
There are users which print time and date represented by content of
struct rtc_time in human readable format.
Instead of open coding that each time introduce %ptR[dt][r] specifier.
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Guan Xuetao <gxt@mprc.pku.edu.cn>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jason Wessel <jason.wessel@windriver.com>
Cc: Jonathan Corbet <corbet@lwn.net>
Cc: Jonathan Hunter <jonathanh@nvidia.com>
Cc: Krzysztof Kozlowski <krzk@kernel.org>
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
Cc: Thierry Reding <thierry.reding@gmail.com>
Cc: Petr Mladek <pmladek@suse.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
Documentation/core-api/printk-formats.rst | 18 ++++
lib/test_printf.c | 6 ++
lib/vsprintf.c | 111 ++++++++++++++++++++++
3 files changed, 135 insertions(+)
diff --git a/Documentation/core-api/printk-formats.rst b/Documentation/core-api/printk-formats.rst
index ff48b55040ef..a7fae4538946 100644
--- a/Documentation/core-api/printk-formats.rst
+++ b/Documentation/core-api/printk-formats.rst
@@ -412,6 +412,24 @@ Examples::
Passed by reference.
+Time and date (struct rtc_time)
+-------------------------------
+
+::
+
+ %ptR YYYY-mm-ddTHH:MM:SS
+ %ptRd YYYY-mm-dd
+ %ptRt HH:MM:SS
+ %ptR[dt][r]
+
+For printing date and time as represented by struct rtc_time structure in
+human readable format.
+
+By default year will be incremented by 1900 and month by 1. Use %ptRr (raw)
+to suppress this behaviour.
+
+Passed by reference.
+
struct clk
----------
diff --git a/lib/test_printf.c b/lib/test_printf.c
index 53527ea822b5..97b7d14961d6 100644
--- a/lib/test_printf.c
+++ b/lib/test_printf.c
@@ -418,6 +418,11 @@ struct_va_format(void)
{
}
+static void __init
+struct_rtc_time(void)
+{
+}
+
static void __init
struct_clk(void)
{
@@ -529,6 +534,7 @@ test_pointer(void)
uuid();
dentry();
struct_va_format();
+ struct_rtc_time();
struct_clk();
bitmap();
netdev_features();
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index 37a54a6dd594..b7114799b91f 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -30,6 +30,7 @@
#include <linux/ioport.h>
#include <linux/dcache.h>
#include <linux/cred.h>
+#include <linux/rtc.h>
#include <linux/uuid.h>
#include <linux/of.h>
#include <net/addrconf.h>
@@ -822,6 +823,20 @@ static const struct printf_spec default_dec_spec = {
.precision = -1,
};
+static const struct printf_spec default_dec02_spec = {
+ .base = 10,
+ .field_width = 2,
+ .precision = -1,
+ .flags = ZEROPAD,
+};
+
+static const struct printf_spec default_dec04_spec = {
+ .base = 10,
+ .field_width = 4,
+ .precision = -1,
+ .flags = ZEROPAD,
+};
+
static noinline_for_stack
char *resource_string(char *buf, char *end, struct resource *res,
struct printf_spec spec, const char *fmt)
@@ -1549,6 +1564,98 @@ char *address_val(char *buf, char *end, const void *addr, const char *fmt)
return special_hex_number(buf, end, num, size);
}
+static noinline_for_stack
+char *date_str(char *buf, char *end, const struct rtc_time *tm, bool r)
+{
+ int year = tm->tm_year + (r ? 0 : 1900);
+ int mon = tm->tm_mon + (r ? 0 : 1);
+
+ buf = number(buf, end, year, default_dec04_spec);
+ if (buf < end)
+ *buf = '-';
+ buf++;
+
+ buf = number(buf, end, mon, default_dec02_spec);
+ if (buf < end)
+ *buf = '-';
+ buf++;
+
+ return number(buf, end, tm->tm_mday, default_dec02_spec);
+}
+
+static noinline_for_stack
+char *time_str(char *buf, char *end, const struct rtc_time *tm, bool r)
+{
+ buf = number(buf, end, tm->tm_hour, default_dec02_spec);
+ if (buf < end)
+ *buf = ':';
+ buf++;
+
+ buf = number(buf, end, tm->tm_min, default_dec02_spec);
+ if (buf < end)
+ *buf = ':';
+ buf++;
+
+ return number(buf, end, tm->tm_sec, default_dec02_spec);
+}
+
+static noinline_for_stack
+char *rtc_str(char *buf, char *end, const struct rtc_time *tm, const char *fmt)
+{
+ bool have_t = true, have_d = true;
+ bool raw = false;
+ int count = 2;
+ bool found;
+
+ switch (fmt[count]) {
+ case 'd':
+ have_t = false;
+ count++;
+ break;
+ case 't':
+ have_d = false;
+ count++;
+ break;
+ }
+
+ found = true;
+ do {
+ switch (fmt[count++]) {
+ case 'r':
+ raw = true;
+ break;
+ default:
+ found = false;
+ break;
+ }
+ } while (found);
+
+ if (have_d)
+ buf = date_str(buf, end, tm, raw);
+ if (have_d && have_t) {
+ /* Respect ISO 8601 */
+ if (buf < end)
+ *buf = 'T';
+ buf++;
+ }
+ if (have_t)
+ buf = time_str(buf, end, tm, raw);
+
+ return buf;
+}
+
+static noinline_for_stack
+char *timeanddate(char *buf, char *end, void *ptr, struct printf_spec spec,
+ const char *fmt)
+{
+ switch (fmt[1]) {
+ case 'R':
+ return rtc_str(buf, end, (const struct rtc_time *)ptr, fmt);
+ default:
+ return ptr_to_id(buf, end, ptr, spec);
+ }
+}
+
static noinline_for_stack
char *clock(char *buf, char *end, struct clk *clk, struct printf_spec spec,
const char *fmt)
@@ -1828,6 +1935,8 @@ char *device_node_string(char *buf, char *end, struct device_node *dn,
* - 'd[234]' For a dentry name (optionally 2-4 last components)
* - 'D[234]' Same as 'd' but for a struct file
* - 'g' For block_device name (gendisk + partition number)
+ * - 't[R][dt][r]' For time and date as represented:
+ * R struct rtc_time
* - 'C' For a clock, it prints the name (Common Clock Framework) or address
* (legacy clock framework) of the clock
* - 'Cn' For a clock, it prints the name (Common Clock Framework) or address
@@ -1952,6 +2061,8 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr,
return address_val(buf, end, ptr, fmt);
case 'd':
return dentry_name(buf, end, ptr, spec, fmt);
+ case 't':
+ return timeanddate(buf, end, ptr, spec, fmt);
case 'C':
return clock(buf, end, ptr, spec, fmt);
case 'D':
--
2.19.2
next prev parent reply other threads:[~2018-11-29 11:04 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-11-29 10:59 [PATCH v5 00/21] lib, rtc: Print rtc_time via %ptR[dt][r] Andy Shevchenko
2018-11-29 10:59 ` [PATCH v5 01/21] nvmem: Move nvmem_type_str array to its only user Andy Shevchenko
2018-11-29 10:59 ` Andy Shevchenko [this message]
2018-12-04 13:30 ` [PATCH v5 02/21] lib/vsprintf: Print time and date in human readable format via %pt Petr Mladek
2018-12-04 16:12 ` Andy Shevchenko
2018-12-04 16:16 ` Geert Uytterhoeven
2018-12-04 16:38 ` Andy Shevchenko
2018-11-29 10:59 ` [PATCH v5 03/21] rtc: Switch to use %ptR Andy Shevchenko
2018-11-29 10:59 ` [PATCH v5 04/21] rtc: at91rm9200: " Andy Shevchenko
2018-11-29 10:59 ` [PATCH v5 05/21] rtc: at91sam9: " Andy Shevchenko
2018-11-29 10:59 ` [PATCH v5 06/21] rtc: m41t80: " Andy Shevchenko
2018-11-29 10:59 ` [PATCH v5 07/21] rtc: m48t59: " Andy Shevchenko
2018-11-29 10:59 ` [PATCH v5 08/21] rtc: mcp795: " Andy Shevchenko
2018-11-29 10:59 ` [PATCH v5 09/21] rtc: pcf50633: " Andy Shevchenko
2018-11-29 10:59 ` [PATCH v5 10/21] rtc: pic32: " Andy Shevchenko
2018-11-29 10:59 ` [PATCH v5 11/21] rtc: pm8xxx: " Andy Shevchenko
2018-11-29 10:59 ` [PATCH v5 12/21] rtc: puv3: " Andy Shevchenko
2018-11-29 10:59 ` [PATCH v5 13/21] rtc: rk808: " Andy Shevchenko
2018-11-29 10:59 ` [PATCH v5 14/21] rtc: rx6110: " Andy Shevchenko
2018-11-29 10:59 ` [PATCH v5 15/21] rtc: rx8025: " Andy Shevchenko
2018-11-29 10:59 ` [PATCH v5 16/21] rtc: s3c: " Andy Shevchenko
2018-11-29 10:59 ` [PATCH v5 17/21] rtc: s5m: " Andy Shevchenko
2018-11-29 10:59 ` [PATCH v5 18/21] rtc: tegra: " Andy Shevchenko
2018-11-29 10:59 ` [PATCH v5 19/21] Input: hp_sdc_rtc - " Andy Shevchenko
2018-11-29 10:59 ` [PATCH v5 20/21] m68k/mac: " Andy Shevchenko
2018-12-02 9:42 ` Geert Uytterhoeven
2018-11-29 10:59 ` [PATCH v5 21/21] PM: " Andy Shevchenko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20181129105956.25933-3-andriy.shevchenko@linux.intel.com \
--to=andriy.shevchenko@linux.intel.com \
--cc=a.zummo@towertech.it \
--cc=alexandre.belloni@bootlin.com \
--cc=arnd@arndb.de \
--cc=b.zolnierkie@samsung.com \
--cc=corbet@lwn.net \
--cc=dmitry.torokhov@gmail.com \
--cc=geert@linux-m68k.org \
--cc=gregkh@linuxfoundation.org \
--cc=gxt@mprc.pku.edu.cn \
--cc=jason.wessel@windriver.com \
--cc=joe@perches.com \
--cc=jonathanh@nvidia.com \
--cc=krzk@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rtc@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=pmladek@suse.com \
--cc=rasmus.villemoes@prevas.dk \
--cc=rjw@rjwysocki.net \
--cc=salyzyn@android.com \
--cc=thierry.reding@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.