From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
To: Rasmus Villemoes <rasmus.villemoes@prevas.dk>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Andrew Morton <akpm@linux-foundation.org>,
linux-kernel@vger.kernel.org,
Alessandro Zummo <a.zummo@towertech.it>,
Alexandre Belloni <alexandre.belloni@free-electrons.com>,
linux-rtc@vger.kernel.org
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
Arnd Bergmann <arnd@arndb.de>,
Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>,
Dmitry Torokhov <dmitry.torokhov@gmail.com>,
Geert Uytterhoeven <geert@linux-m68k.org>,
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 v1 04/25] lib/vsprintf: Print time and date in human readable format via %pt
Date: Thu, 8 Jun 2017 16:47:50 +0300 [thread overview]
Message-ID: <20170608134811.60786-5-andriy.shevchenko@linux.intel.com> (raw)
In-Reply-To: <20170608134811.60786-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 %pt[dt][rv] 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/printk-formats.txt | 17 ++++++
lib/vsprintf.c | 124 +++++++++++++++++++++++++++++++++++++++
2 files changed, 141 insertions(+)
diff --git a/Documentation/printk-formats.txt b/Documentation/printk-formats.txt
index d8c40c30118a..fa5b718a5dcc 100644
--- a/Documentation/printk-formats.txt
+++ b/Documentation/printk-formats.txt
@@ -282,6 +282,23 @@ struct va_format:
Passed by reference.
+struct rtc_time:
+
+ %pt YYYY-mm-dd HH:MM:SS
+ %ptd YYYY-mm-dd
+ %ptt HH:MM:SS
+ %pt[dt][rv]
+
+ 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
+ 'r' (raw) to suppress this behaviour. On the other hand when
+ 'v' is applied validation mechanism will be in use, i.e. numbers
+ out of range will be replaced by '**' or '****'.
+
+ Passed by reference.
+
struct clk:
%pC pll1
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index 001303612b55..653d08b50850 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 <net/addrconf.h>
#ifdef CONFIG_BLOCK
@@ -701,6 +702,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)
@@ -1382,6 +1397,112 @@ char *address_val(char *buf, char *end, const void *addr, const char *fmt)
}
static noinline_for_stack
+char *date_string(char *buf, char *end, const struct rtc_time *tm, bool v, bool r)
+{
+ int year = tm->tm_year + (r ? 0 : 1900);
+ int mon = tm->tm_mon + (r ? 0 : 1);
+
+ if (unlikely(v && (unsigned int)tm->tm_year > 200))
+ buf = string(buf, end, "****", default_str_spec);
+ else
+ buf = number(buf, end, year, default_dec04_spec);
+
+ if (buf < end)
+ *buf = '-';
+ buf++;
+
+ if (unlikely(v && (unsigned int)tm->tm_mon > 11))
+ buf = string(buf, end, "**", default_str_spec);
+ else
+ buf = number(buf, end, mon, default_dec02_spec);
+
+ if (buf < end)
+ *buf = '-';
+ buf++;
+
+ if (unlikely(v && (unsigned int)tm->tm_mday > 31))
+ buf = string(buf, end, "**", default_str_spec);
+ else
+ buf = number(buf, end, tm->tm_mday, default_dec02_spec);
+
+ return buf;
+}
+
+static noinline_for_stack
+char *time_string(char *buf, char *end, const struct rtc_time *tm, bool v, bool r)
+{
+ if (unlikely(v && (unsigned int)tm->tm_hour > 24))
+ buf = string(buf, end, "**", default_str_spec);
+ else
+ buf = number(buf, end, tm->tm_hour, default_dec02_spec);
+
+ if (buf < end)
+ *buf = ':';
+ buf++;
+
+ if (unlikely(v && (unsigned int)tm->tm_min > 59))
+ buf = string(buf, end, "**", default_str_spec);
+ else
+ buf = number(buf, end, tm->tm_min, default_dec02_spec);
+
+ if (buf < end)
+ *buf = ':';
+ buf++;
+
+ if (unlikely(v && (unsigned int)tm->tm_sec > 59))
+ buf = string(buf, end, "**", default_str_spec);
+ else
+ buf = number(buf, end, tm->tm_sec, default_dec02_spec);
+
+ return buf;
+}
+
+static noinline_for_stack
+char *timeanddate(char *buf, char *end, const struct rtc_time *tm, const char *fmt)
+{
+ bool have_t = true, have_d = true;
+ bool validate = false;
+ bool raw = false;
+ int count = 0;
+ bool found;
+
+ switch (fmt[++count]) {
+ case 'd':
+ have_t = false;
+ break;
+ case 't':
+ have_d = false;
+ break;
+ }
+
+ /* No %pt[dt] supplied */
+ if (have_t && have_d)
+ --count;
+
+ found = true;
+ do {
+ switch (fmt[++count]) {
+ case 'r':
+ raw = true;
+ break;
+ case 'v':
+ validate = true;
+ break;
+ default:
+ found = false;
+ break;
+ }
+ } while (found);
+
+ if (have_d)
+ buf = date_string(buf, end, tm, validate, raw);
+ if (have_t)
+ buf = time_string(buf, end, tm, validate, raw);
+
+ return buf;
+}
+
+static noinline_for_stack
char *clock(char *buf, char *end, struct clk *clk, struct printf_spec spec,
const char *fmt)
{
@@ -1550,6 +1671,7 @@ int kptr_restrict __read_mostly;
* - '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[dt][rv]' For time and date as represented in 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
@@ -1702,6 +1824,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, (const struct rtc_time *)ptr, fmt);
case 'C':
return clock(buf, end, ptr, spec, fmt);
case 'D':
--
2.11.0
next prev parent reply other threads:[~2017-06-08 13:48 UTC|newest]
Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-08 13:47 [PATCH v1 00/25] lib, rtc: Print rtc_time via %pt[dt][rv] Andy Shevchenko
2017-06-08 13:47 ` [PATCH v1 01/25] lib/vsprintf: Remove useless NULL checks Andy Shevchenko
2017-06-08 20:59 ` Rasmus Villemoes
2017-07-20 10:22 ` Andy Shevchenko
2017-06-08 13:47 ` [PATCH v1 02/25] lib/vsprintf: Make decspec global Andy Shevchenko
2017-06-08 13:47 ` [PATCH v1 03/25] lib/vsprintf: Make strspec global Andy Shevchenko
2017-06-08 13:47 ` Andy Shevchenko [this message]
2017-06-08 14:49 ` [PATCH v1 04/25] lib/vsprintf: Print time and date in human readable format via %pt Arnd Bergmann
2017-06-08 14:55 ` Andy Shevchenko
2017-06-08 15:05 ` Alexandre Belloni
2017-06-08 17:57 ` Andy Shevchenko
2017-06-08 18:41 ` Alexandre Belloni
2017-06-08 18:49 ` Andy Shevchenko
2017-06-08 20:42 ` Rasmus Villemoes
2017-06-08 21:25 ` Andy Shevchenko
2017-06-08 21:45 ` Arnd Bergmann
2017-07-20 10:30 ` Andy Shevchenko
2017-06-08 15:33 ` Arnd Bergmann
2017-06-08 15:48 ` Joe Perches
2017-06-08 18:02 ` Andy Shevchenko
2017-06-08 23:09 ` Joe Perches
2017-06-08 13:47 ` [PATCH v1 05/25] ds1302: Switch to use %pt Andy Shevchenko
2017-06-08 14:00 ` Greg Kroah-Hartman
2017-06-08 13:47 ` [PATCH v1 06/25] rtc: " Andy Shevchenko
2017-06-08 14:00 ` Greg Kroah-Hartman
2017-06-08 18:38 ` Andy Shevchenko
2017-06-08 13:47 ` [PATCH v1 07/25] rtc: at91rm9200: " Andy Shevchenko
2017-06-08 13:47 ` [PATCH v1 08/25] rtc: at91sam9: " Andy Shevchenko
2017-06-08 13:47 ` [PATCH v1 09/25] rtc: m41t80: " Andy Shevchenko
2017-06-08 13:47 ` [PATCH v1 10/25] rtc: m48t59: " Andy Shevchenko
2017-06-08 13:47 ` [PATCH v1 11/25] rtc: mcp795: " Andy Shevchenko
2017-06-08 13:47 ` [PATCH v1 12/25] rtc: pcf50633: " Andy Shevchenko
2017-06-08 13:47 ` [PATCH v1 13/25] rtc: pic32: " Andy Shevchenko
2017-06-08 13:48 ` [PATCH v1 14/25] rtc: pm8xxx: " Andy Shevchenko
2017-06-08 13:48 ` [PATCH v1 15/25] rtc: puv3: " Andy Shevchenko
2017-06-08 13:48 ` [PATCH v1 16/25] rtc: rk808: " Andy Shevchenko
2017-06-08 13:48 ` [PATCH v1 17/25] rtc: rx6110: " Andy Shevchenko
2017-06-08 13:48 ` [PATCH v1 18/25] rtc: rx8025: " Andy Shevchenko
2017-06-08 13:48 ` [PATCH v1 19/25] rtc: s3c: " Andy Shevchenko
2017-06-08 13:48 ` [PATCH v1 20/25] rtc: s5m: " Andy Shevchenko
2017-06-08 16:46 ` Krzysztof Kozlowski
2017-06-08 13:48 ` [PATCH v1 21/25] rtc: tegra: " Andy Shevchenko
2017-06-08 13:48 ` [PATCH v1 22/25] mk68/mac: " Andy Shevchenko
2017-06-08 13:48 ` [PATCH v1 23/25] Input: hp_sdc_rtc - " Andy Shevchenko
2017-06-08 13:48 ` [PATCH v1 24/25] kdb: " Andy Shevchenko
2017-06-09 13:42 ` Daniel Thompson
2017-10-12 13:31 ` Arnd Bergmann
2017-10-12 17:05 ` Andy Shevchenko
2017-10-13 7:42 ` Arnd Bergmann
2017-06-08 13:48 ` [PATCH v1 25/25] PM: " Andy Shevchenko
2017-06-08 17:16 ` Rafael J. Wysocki
2017-06-08 14:52 ` [PATCH v1 00/25] lib, rtc: Print rtc_time via %pt[dt][rv] Joe Perches
2017-06-08 15:02 ` Andy Shevchenko
2017-06-09 5:08 ` Joe Perches
2017-07-18 17:50 ` Joe Perches
2017-07-18 17:55 ` Andy Shevchenko
2017-07-18 18:32 ` Joe Perches
2017-07-18 19:57 ` Mark Salyzyn
2017-07-20 10:33 ` Andy Shevchenko
2017-07-20 17:57 ` Mark Salyzyn
2017-07-21 4:07 ` Joe Perches
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=20170608134811.60786-5-andriy.shevchenko@linux.intel.com \
--to=andriy.shevchenko@linux.intel.com \
--cc=a.zummo@towertech.it \
--cc=akpm@linux-foundation.org \
--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=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=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.