You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by cc...@apache.org on 2016/04/14 04:32:45 UTC

incubator-mynewt-core git commit: Fix for tinyprintf integer fmt spec.

Repository: incubator-mynewt-core
Updated Branches:
  refs/heads/develop 226c23d1f -> 4e5462f34


Fix for tinyprintf integer fmt spec.

A bug was introduced in adding support for (unsigned) long long to
tinyprintf: all var args were assumed to be 64 bits.  This fix uses the
correct object size when pulling integers out of the va_args list.


Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/4e5462f3
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/4e5462f3
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/4e5462f3

Branch: refs/heads/develop
Commit: 4e5462f341361ed8aa380d31766d95fa8a8107fd
Parents: 226c23d
Author: Christopher Collins <cc...@apache.org>
Authored: Wed Apr 13 19:31:08 2016 -0700
Committer: Christopher Collins <cc...@apache.org>
Committed: Wed Apr 13 19:31:08 2016 -0700

----------------------------------------------------------------------
 libs/baselibc/src/tinyprintf.c | 106 +++++++++++++++---------------------
 1 file changed, 44 insertions(+), 62 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/4e5462f3/libs/baselibc/src/tinyprintf.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/tinyprintf.c b/libs/baselibc/src/tinyprintf.c
index 01fa4fb..d57b2dd 100644
--- a/libs/baselibc/src/tinyprintf.c
+++ b/libs/baselibc/src/tinyprintf.c
@@ -72,37 +72,6 @@ struct param {
     char *bf;           /**<  Buffer to output */
 };
 
-#ifdef PRINTF_LONG_SUPPORT
-
-static void uli2a(unsigned long int num, struct param *p)
-{
-    int n = 0;
-    unsigned long int d = 1;
-    char *bf = p->bf;
-    while (num / d >= p->base)
-        d *= p->base;
-    while (d != 0) {
-        int dgt = num / d;
-        num %= d;
-        d /= p->base;
-        if (n || dgt > 0 || d == 0) {
-            *bf++ = dgt + (dgt < 10 ? '0' : (p->uc ? 'A' : 'a') - 10);
-            ++n;
-        }
-    }
-    *bf = 0;
-}
-
-static void li2a(long num, struct param *p)
-{
-    if (num < 0) {
-        num = -num;
-        p->sign = 1;
-    }
-    uli2a(num, p);
-}
-#endif
-
 static void ui2a(unsigned long long int num, struct param *p)
 {
     int n = 0;
@@ -216,18 +185,50 @@ static unsigned putchw(FILE *putp, struct param *p)
     return written;
 }
 
+static unsigned long long
+intarg(int lng, int sign, va_list va)
+{
+    unsigned long long val;
+
+    switch (lng) {
+    case 0:
+        if (sign) {
+            val = va_arg(va, int);
+        } else {
+            val = va_arg(va, unsigned int);
+        }
+        break;
+
+    case 1:
+        if (sign) {
+            val = va_arg(va, long);
+        } else {
+            val = va_arg(va, unsigned long);
+        }
+        break;
+
+    case 2:
+    default:
+        if (sign) {
+            val = va_arg(va, long long);
+        } else {
+            val = va_arg(va, unsigned long long);
+        }
+        break;
+    }
+
+    return val;
+}
+
 size_t tfp_format(FILE *putp, const char *fmt, va_list va)
 {
     size_t written = 0;
     struct param p;
-#ifdef PRINTF_LONG_SUPPORT
     char bf[23];
-#else
-    char bf[12];
-#endif
-    p.bf = bf;
-
     char ch;
+    char lng = 0;
+
+    p.bf = bf;
 
     while ((ch = *(fmt++))) {
         if (ch != '%') {
@@ -238,9 +239,6 @@ size_t tfp_format(FILE *putp, const char *fmt, va_list va)
             p.alt = 0;
             p.width = 0;
             p.sign = 0;
-#ifdef PRINTF_LONG_SUPPORT
-            char lng = 0;
-#endif
 
             /* Flags */
             while ((ch = *(fmt++))) {
@@ -263,12 +261,11 @@ size_t tfp_format(FILE *putp, const char *fmt, va_list va)
             }
             if (ch == 'l') {
                 ch = *(fmt++);
-#ifdef PRINTF_LONG_SUPPORT
                 lng = 1;
-#endif
-                /* Ignore second long specifier. */
+
                 if (ch == 'l') {
                     ch = *(fmt++);
+                    lng = 2;
                 }
             }
 
@@ -277,40 +274,25 @@ size_t tfp_format(FILE *putp, const char *fmt, va_list va)
                 goto abort;
             case 'u':
                 p.base = 10;
-#ifdef PRINTF_LONG_SUPPORT
-                if (lng)
-                    uli2a(va_arg(va, unsigned long int), &p);
-                else
-#endif
-                    ui2a(va_arg(va, unsigned long long int), &p);
+                ui2a(intarg(lng, 0, va), &p);
                 written += putchw(putp, &p);
                 break;
             case 'd':
             case 'i':
                 p.base = 10;
-#ifdef PRINTF_LONG_SUPPORT
-                if (lng)
-                    li2a(va_arg(va, unsigned long int), &p);
-                else
-#endif
-                    i2a(va_arg(va, long long int), &p);
+                i2a(intarg(lng, 1, va), &p);
                 written += putchw(putp, &p);
                 break;
             case 'x':
             case 'X':
                 p.base = 16;
                 p.uc = (ch == 'X');
-#ifdef PRINTF_LONG_SUPPORT
-                if (lng)
-                    uli2a(va_arg(va, unsigned long int), &p);
-                else
-#endif
-                    ui2a(va_arg(va, unsigned long long int), &p);
+                i2a(intarg(lng, 0, va), &p);
                 written += putchw(putp, &p);
                 break;
             case 'o':
                 p.base = 8;
-                ui2a(va_arg(va, unsigned long long int), &p);
+                i2a(intarg(lng, 0, va), &p);
                 written += putchw(putp, &p);
                 break;
             case 'c':