qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PULL 023/118] libdecnumber: Introduce decNumberFrom[U]Int6


From: Alexander Graf
Subject: [Qemu-devel] [PULL 023/118] libdecnumber: Introduce decNumberFrom[U]Int64
Date: Wed, 4 Jun 2014 14:43:24 +0200

From: Tom Musta <address@hidden>

Introduce two conversion functions to the libdecnumber library.
These conversions transform 64 bit integers to the internal decNumber
representation.  Both a signed and unsigned version is added.

Signed-off-by: Tom Musta <address@hidden>
Signed-off-by: Alexander Graf <address@hidden>
---
 include/libdecnumber/decNumber.h |  2 ++
 libdecnumber/decNumber.c         | 30 ++++++++++++++++++++++++++++++
 2 files changed, 32 insertions(+)

diff --git a/include/libdecnumber/decNumber.h b/include/libdecnumber/decNumber.h
index fb324bd..f4bf994 100644
--- a/include/libdecnumber/decNumber.h
+++ b/include/libdecnumber/decNumber.h
@@ -115,6 +115,8 @@
   /* Conversions                                                     */
   decNumber * decNumberFromInt32(decNumber *, int32_t);
   decNumber * decNumberFromUInt32(decNumber *, uint32_t);
+  decNumber *decNumberFromInt64(decNumber *, int64_t);
+  decNumber *decNumberFromUInt64(decNumber *, uint64_t);
   decNumber * decNumberFromString(decNumber *, const char *, decContext *);
   char     * decNumberToString(const decNumber *, char *);
   char     * decNumberToEngString(const decNumber *, char *);
diff --git a/libdecnumber/decNumber.c b/libdecnumber/decNumber.c
index f6b6eb1..6bd7565 100644
--- a/libdecnumber/decNumber.c
+++ b/libdecnumber/decNumber.c
@@ -436,6 +436,36 @@ uInt decNumberToUInt32(const decNumber *dn, decContext 
*set) {
   return 0;
   } /* decNumberToUInt32 */
 
+decNumber *decNumberFromInt64(decNumber *dn, int64_t in)
+{
+    uint64_t unsig = in;
+    if (in < 0) {
+        unsig = -unsig;
+    }
+
+    decNumberFromUInt64(dn, unsig);
+    if (in < 0) {
+        dn->bits = DECNEG;        /* sign needed */
+    }
+    return dn;
+} /* decNumberFromInt64 */
+
+decNumber *decNumberFromUInt64(decNumber *dn, uint64_t uin)
+{
+    Unit *up;                             /* work pointer */
+    decNumberZero(dn);                    /* clean */
+    if (uin == 0) {
+        return dn;                /* [or decGetDigits bad call] */
+    }
+    for (up = dn->lsu; uin > 0; up++) {
+        *up = (Unit)(uin % (DECDPUNMAX + 1));
+        uin = uin / (DECDPUNMAX + 1);
+    }
+    dn->digits = decGetDigits(dn->lsu, up-dn->lsu);
+    return dn;
+} /* decNumberFromUInt64 */
+
+
 /* ------------------------------------------------------------------ */
 /* to-scientific-string -- conversion to numeric string                      */
 /* to-engineering-string -- conversion to numeric string             */
-- 
1.8.1.4




reply via email to

[Prev in Thread] Current Thread [Next in Thread]