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':