From: Tao Xu <tao3.xu@intel.com>
To: imammedo@redhat.com, eblake@redhat.com, ehabkost@redhat.com
Cc: jingqi.liu@intel.com, tao3.xu@intel.com, fan.du@intel.com,
qemu-devel@nongnu.org, jonathan.cameron@huawei.com
Subject: [PATCH v13 01/12] util/cutils: Add qemu_strtotime_ps()
Date: Sun, 20 Oct 2019 19:11:14 +0800 [thread overview]
Message-ID: <20191020111125.27659-2-tao3.xu@intel.com> (raw)
In-Reply-To: <20191020111125.27659-1-tao3.xu@intel.com>
To convert strings with time suffixes to numbers, support time unit are
"ps" for picosecond, "ns" for nanosecond, "us" for microsecond, "ms"
for millisecond or "s" for second.
Signed-off-by: Tao Xu <tao3.xu@intel.com>
---
No changes in v13.
---
include/qemu/cutils.h | 1 +
util/cutils.c | 82 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 83 insertions(+)
diff --git a/include/qemu/cutils.h b/include/qemu/cutils.h
index b54c847e0f..7b6d106bdd 100644
--- a/include/qemu/cutils.h
+++ b/include/qemu/cutils.h
@@ -182,5 +182,6 @@ int uleb128_decode_small(const uint8_t *in, uint32_t *n);
* *str1 is <, == or > than *str2.
*/
int qemu_pstrcmp0(const char **str1, const char **str2);
+int qemu_strtotime_ps(const char *nptr, const char **end, uint64_t *result);
#endif
diff --git a/util/cutils.c b/util/cutils.c
index fd591cadf0..a50c15f46a 100644
--- a/util/cutils.c
+++ b/util/cutils.c
@@ -847,3 +847,85 @@ int qemu_pstrcmp0(const char **str1, const char **str2)
{
return g_strcmp0(*str1, *str2);
}
+
+static int64_t timeunit_mul(const char *unitstr)
+{
+ if (g_strcmp0(unitstr, "ps") == 0) {
+ return 1;
+ } else if (g_strcmp0(unitstr, "ns") == 0) {
+ return 1000;
+ } else if (g_strcmp0(unitstr, "us") == 0) {
+ return 1000000;
+ } else if (g_strcmp0(unitstr, "ms") == 0) {
+ return 1000000000LL;
+ } else if (g_strcmp0(unitstr, "s") == 0) {
+ return 1000000000000LL;
+ } else {
+ return -1;
+ }
+}
+
+
+/*
+ * Convert string to time, support time unit are ps for picosecond,
+ * ns for nanosecond, us for microsecond, ms for millisecond or s for second.
+ * End pointer will be returned in *end, if not NULL. Return -ERANGE on
+ * overflow, and -EINVAL on other error.
+ */
+static int do_strtotime(const char *nptr, const char **end,
+ const char *default_unit, uint64_t *result)
+{
+ int retval;
+ const char *endptr;
+ int mul_required = 0;
+ int64_t mul;
+ double val, integral, fraction;
+
+ retval = qemu_strtod_finite(nptr, &endptr, &val);
+ if (retval) {
+ goto out;
+ }
+ fraction = modf(val, &integral);
+ if (fraction != 0) {
+ mul_required = 1;
+ }
+
+ mul = timeunit_mul(endptr);
+
+ if (mul == 1000000000000LL) {
+ endptr++;
+ } else if (mul != -1) {
+ endptr += 2;
+ } else {
+ mul = timeunit_mul(default_unit);
+ assert(mul >= 0);
+ }
+ if (mul == 1 && mul_required) {
+ retval = -EINVAL;
+ goto out;
+ }
+ /*
+ * Values >= 0xfffffffffffffc00 overflow uint64_t after their trip
+ * through double (53 bits of precision).
+ */
+ if ((val * (double)mul >= 0xfffffffffffffc00) || val < 0) {
+ retval = -ERANGE;
+ goto out;
+ }
+ *result = val * (double)mul;
+ retval = 0;
+
+out:
+ if (end) {
+ *end = endptr;
+ } else if (*endptr) {
+ retval = -EINVAL;
+ }
+
+ return retval;
+}
+
+int qemu_strtotime_ps(const char *nptr, const char **end, uint64_t *result)
+{
+ return do_strtotime(nptr, end, "ps", result);
+}
--
2.20.1
next prev parent reply other threads:[~2019-10-20 11:14 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-20 11:11 [PATCH v13 00/12] Build ACPI Heterogeneous Memory Attribute Table (HMAT) Tao Xu
2019-10-20 11:11 ` Tao Xu [this message]
2019-10-23 1:08 ` [PATCH v13 01/12] util/cutils: Add qemu_strtotime_ps() Eduardo Habkost
2019-10-23 6:07 ` Tao Xu
2019-10-23 1:13 ` Eric Blake
2019-10-23 1:50 ` Tao Xu
2019-10-24 9:54 ` Daniel P. Berrangé
2019-10-24 13:20 ` Eduardo Habkost
2019-10-25 1:22 ` Tao Xu
2019-10-20 11:11 ` [PATCH v13 02/12] tests/cutils: Add test for qemu_strtotime_ps() Tao Xu
2019-10-20 11:11 ` [PATCH v13 03/12] qapi: Add builtin type time Tao Xu
2019-10-20 11:11 ` [PATCH v13 04/12] tests: Add test for QAPI " Tao Xu
2019-10-20 11:11 ` [PATCH v13 05/12] numa: Extend CLI to provide initiator information for numa nodes Tao Xu
2019-10-21 12:29 ` Igor Mammedov
2019-10-22 1:01 ` Tao Xu
2019-10-20 11:11 ` [PATCH v13 06/12] numa: Extend CLI to provide memory latency and bandwidth information Tao Xu
2019-10-22 7:08 ` Igor Mammedov
2019-10-22 8:22 ` Tao Xu
2019-10-23 15:28 ` Igor Mammedov
2019-10-25 6:33 ` Tao Xu
2019-10-25 13:27 ` Igor Mammedov
2019-10-25 19:44 ` Markus Armbruster
2019-10-25 20:51 ` Eduardo Habkost
2019-10-28 2:05 ` Tao Xu
2019-10-28 5:46 ` Markus Armbruster
2019-10-28 7:25 ` Tao Xu
2019-10-20 11:11 ` [PATCH v13 07/12] numa: Calculate hmat latency and bandwidth entry list Tao Xu
2019-10-20 11:11 ` [PATCH v13 08/12] numa: Extend CLI to provide memory side cache information Tao Xu
2019-10-20 11:11 ` [PATCH v13 09/12] hmat acpi: Build Memory Proximity Domain Attributes Structure(s) Tao Xu
2019-10-20 11:11 ` [PATCH v13 10/12] hmat acpi: Build System Locality Latency and Bandwidth Information Structure(s) Tao Xu
2019-10-20 11:11 ` [PATCH v13 11/12] hmat acpi: Build Memory Side Cache " Tao Xu
2019-10-20 11:11 ` [PATCH v13 12/12] tests/bios-tables-test: add test cases for ACPI HMAT Tao Xu
2019-10-20 11:43 ` [PATCH v13 00/12] Build ACPI Heterogeneous Memory Attribute Table (HMAT) no-reply
2019-10-20 12:13 ` no-reply
2019-10-20 12:57 ` no-reply
2019-10-20 13:19 ` no-reply
2019-10-22 11:22 ` Markus Armbruster
2019-10-23 1:46 ` Tao Xu
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=20191020111125.27659-2-tao3.xu@intel.com \
--to=tao3.xu@intel.com \
--cc=eblake@redhat.com \
--cc=ehabkost@redhat.com \
--cc=fan.du@intel.com \
--cc=imammedo@redhat.com \
--cc=jingqi.liu@intel.com \
--cc=jonathan.cameron@huawei.com \
--cc=qemu-devel@nongnu.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).