From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
To: Alessandro Zummo <a.zummo@towertech.it>,
Alexandre Belloni <alexandre.belloni@free-electrons.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>
Subject: [PATCH v4 02/21] lib/vsprintf: Print time and date in human readable format via %pt
Date: Wed, 28 Nov 2018 21:05:18 +0200 [thread overview]
Message-ID: <20181128190537.14074-3-andriy.shevchenko@linux.intel.com> (raw)
In-Reply-To: <20181128190537.14074-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>
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..0a66d0b9c589 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][rv]' 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-28 19:07 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-11-28 19:05 [PATCH v4 00/21] lib, rtc: Print rtc_time via %ptR[dt][r] Andy Shevchenko
2018-11-28 19:05 ` [PATCH v4 01/21] nvmem: Mark nvmem_type_str array with __maybe_unused Andy Shevchenko
2018-11-28 21:05 ` Alexandre Belloni
2018-11-29 0:10 ` Joe Perches
2018-11-28 19:05 ` Andy Shevchenko [this message]
2018-11-28 19:05 ` [PATCH v4 03/21] rtc: Switch to use %ptR Andy Shevchenko
2018-11-28 19:05 ` [PATCH v4 04/21] rtc: at91rm9200: " Andy Shevchenko
2018-11-28 19:05 ` [PATCH v4 05/21] rtc: at91sam9: " Andy Shevchenko
2018-11-28 19:05 ` [PATCH v4 06/21] rtc: m41t80: " Andy Shevchenko
2018-11-28 19:05 ` [PATCH v4 07/21] rtc: m48t59: " Andy Shevchenko
2018-11-28 19:05 ` [PATCH v4 08/21] rtc: mcp795: " Andy Shevchenko
2018-11-28 19:05 ` [PATCH v4 09/21] rtc: pcf50633: " Andy Shevchenko
2018-11-28 19:05 ` [PATCH v4 10/21] rtc: pic32: " Andy Shevchenko
2018-11-28 19:05 ` [PATCH v4 11/21] rtc: pm8xxx: " Andy Shevchenko
2018-11-28 19:05 ` [PATCH v4 12/21] rtc: puv3: " Andy Shevchenko
2018-11-28 19:05 ` [PATCH v4 13/21] rtc: rk808: " Andy Shevchenko
2018-11-28 19:05 ` [PATCH v4 14/21] rtc: rx6110: " Andy Shevchenko
2018-11-28 19:05 ` [PATCH v4 15/21] rtc: rx8025: " Andy Shevchenko
2018-11-28 19:05 ` [PATCH v4 16/21] rtc: s3c: " Andy Shevchenko
2018-11-28 19:05 ` [PATCH v4 17/21] rtc: s5m: " Andy Shevchenko
2018-11-28 19:05 ` [PATCH v4 18/21] rtc: tegra: " Andy Shevchenko
2018-11-28 19:48 ` Thierry Reding
2018-11-28 19:05 ` [PATCH v4 19/21] Input: hp_sdc_rtc - " Andy Shevchenko
2018-11-28 19:05 ` [PATCH v4 20/21] mk68/mac: " Andy Shevchenko
2018-11-29 9:08 ` Geert Uytterhoeven
2018-11-29 9:09 ` Geert Uytterhoeven
2018-11-28 19:05 ` [PATCH v4 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=20181128190537.14074-3-andriy.shevchenko@linux.intel.com \
--to=andriy.shevchenko@linux.intel.com \
--cc=a.zummo@towertech.it \
--cc=alexandre.belloni@free-electrons.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=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.